【问题标题】:socket TCP/IP for HTTP communcation用于 HTTP 通信的套接字 TCP/IP
【发布时间】:2014-09-07 10:36:19
【问题描述】:

以下代码是socket教程的示例php代码,我运行成功收集远程站点或localhost网页。我用于socket_create的协议号是0或6,两者都是 number 也在处理那个代码,为什么?我认为网络编程需要将今天的窗口计算机的 TCP 和 IP 包括在一起,以使通信成为可能。为什么只需要 TCP 或 IP 协议 num 就可以使不包括协议 num 的程序代码工作? 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;
              ?>

【问题讨论】:

    标签: sockets network-programming tcp-ip


    【解决方案1】:

    传递 0 作为协议将为您提供默认协议。 AF_INET 说你想要 IP 协议套件(特别是 IPv4)。对于 AF_INET 和 SOCK_STREAM 的组合,tcp 是默认值。 AF_INET6 和 SOCK_DGRAM 的组合将默认为您提供 IPv6 和 UDP。

    TCP 的协议号为 6,如果你想显式的也可以通过。

    【讨论】:

    • 不,感谢您的回复。我的问题为什么两者都可以在 0 (IPv4) 或 6(TCP) 上工作,我认为 TCP 和 IP 需要一起工作以进行通信,请告知
    • 不,请再次查看我的问题,有关 socket_create 的手册,您可以阅读本网站php.net/manual/en/function.socket-create.php,请告知
    • @aabb 我不明白你还问什么。我已经告诉过你 0 的含义。 0 不代表 IPv4。 1. 参数,AF_INET 表示 IPv4。
    • 感谢您的回复,0表示默认协议,取决于计算机默认,例如window上的协议默认是TCP,对吧?
    • 是的,在几乎所有操作系统上,TCP 是 AF_INET 和 SOCK_STREAM 组合的默认设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多