сокет TCP/IP для связи HTTP

Следующий код является примером php-кода для учебника по сокетам, и я успешно запускаю сбор удаленного сайта или веб-страницы локального хоста. Либо номер протокола, который я использовал для socket_create, равен 0 или 6, оба номера также работают над этим кодом, почему? Я думал, что сетевое программирование должно включать TCP и IP для сегодняшнего компьютера с окном вместе, чтобы сделать связь возможной. Почему просто нужен номер протокола TCP или IP, который может заставить работать программный код, который не включает оба номера протокола? TCP — это протокол для транспортного уровня, а IP — это протокол для сетевого уровня как для модели OSI, так и для классической модели TCP/IP.

              <?php
              $protocol = 'tcp';
              $get_prot = getprotobyname($protocol);
              echo $get_prot."----protocol\n";
              if(!($sock = socket_create(AF_INET, SOCK_STREAM, 6)))
              {
              $errorcode = socket_last_error();
              $errormsg = socket_strerror($errorcode);
              die("Couldn't create socket: [$errorcode] $errormsg \n");
               }
             echo "Socket created \n";
             if(!socket_connect($sock , '127.0.0.1' , 80))
             {
             $errorcode = socket_last_error();
             $errormsg = socket_strerror($errorcode);
             die("Could not connect: [$errorcode] $errormsg \n");
             }
             echo "Connection established \n";
             $message = "GET / HTTP/1.1   Accept:          text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8      \r\n\r\n";
             $message = "GET / HTTP/1.1\r\n";
             $message .= "Host: \r\n";
             $message .= "Connection: Close\r\n\r\n";
             //Send the message to the server
             if( ! socket_send ( $sock , $message , strlen($message) , 0))
             {
             $errorcode = socket_last_error();
             $errormsg = socket_strerror($errorcode);
             die("Could not send data: [$errorcode] $errormsg \n");
             }
             echo "Message send successfully \n";
             //Now receive reply from server
             if(socket_recv ( $sock , $buf ,  6144 , MSG_WAITALL ) === FALSE)
             {
             $errorcode = socket_last_error();
             $errormsg = socket_strerror($errorcode);
             die("Could not receive data: [$errorcode] $errormsg \n");
              }
              //print the received message
              echo $buf;
              ?>

person aabb    schedule 07.09.2014    source источник


Ответы (1)


Передача 0 в качестве протокола даст вам протокол по умолчанию. AF_INET говорит, что вам нужен набор протоколов IP (в частности, IPv4). Для комбинации AF_INET и SOCK_STREAM по умолчанию используется tcp. Комбинация AF_INET6 и SOCK_DGRAM даст вам IPv6 и UDP по умолчанию.

TCP имеет номер протокола 6, который вы также можете передать, если хотите быть явным.

person nos    schedule 07.09.2014
comment
нет, спасибо за ответ. Мой вопрос, почему оба также работают либо 0 (IPv4), либо 6 (TCP), и я думал, что TCP и IP должны работать вместе для связи, пожалуйста, сообщите - person aabb; 07.09.2014
comment
нет, пожалуйста, просмотрите мой вопрос еще раз, а руководство по socket_create вы можете прочитать на этом сайте по адресу php.net/manual/en/function.socket-create.php, пожалуйста, сообщите - person aabb; 07.09.2014
comment
@aabb Я не понимаю, о чем еще ты спрашиваешь. Я уже говорил вам, что означает 0. 0 не означает IPv4. Аргумент 1. AF_INET означает IPv4. - person nos; 07.09.2014
comment
спасибо за ваш ответ, 0 означает протокол по умолчанию, который зависит от компьютера по умолчанию, например, протокол по умолчанию в окне - TCP, верно? - person aabb; 07.09.2014
comment
Да, TCP используется по умолчанию для комбинации AF_INET и SOCK_STREAM практически в любой операционной системе. - person nos; 07.09.2014