1

嗨,下面的socket_read函数有问题,它在读取完数据后不返回空字符串''。在第二次调用 socket_read() 时,它只是挂在那里,页面继续在浏览器中加载,没有返回。如果服务器关闭连接,它会起作用,服务器是否必须关闭客户端套接字?谢谢

    $json = $_GET['json'];

    /* Get the port for the WWW service. */
    // $service_port = getservbyname('www', 'tcp');
    $service_port = "1111";

    /* Get the IP address for the target host. */
    $address = "192.168.3.5";

    /* Create a TCP/IP socket. */
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket === false) {
        echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
        die();
    } else {
        //echo "OK.\n";
    }

    //echo "Attempting to connect to '$address' on port '$service_port'...";
    $result = socket_connect($socket, $address, $service_port);
    if ($result === false) {
        echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
        die();
    } else {
        //echo "OK.\n";
    }

    $out = '';

    //echo "Sending HTTP HEAD request...";
    $result = socket_write($socket, $json, strlen($json));

    if ($result === false) {
        echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
        die();
    } else {
        //echo "OK.\n";
    }



    echo socket_read($socket, 2048);
    echo socket_read($socket, 2048);
//  
     // while (socket_read($socket, 2048) !== '') {
        // echo $out;
//       
     // }
//   
     socket_close($socket);
4

1 回答 1

1

是的,这正是我期望它做的——socket_read() 永远不会返回一个空字符串,除非你打开它一个二进制文件并且服务器用'\0'响应。

您似乎正在尝试编写 HTTP 客户端。如果您是,请立即停止,扔掉您的代码并阅读 Curl 扩展。HTTP 不是一个简单的协议,关于简单的东西是如何工作的,你还有很多东西要学习。您目前依靠套接字状态和数据格式来确定数据流 - 但 HTTP 两者都不使用。

如果您想了解 HTTP 的工作原理,那么 Internet 上有很多文档 - RFC 是必须的,但不是简单的介绍。如果您的目标是开发应用程序,请使用 curl(甚至是 HTTP 流包装器)。

于 2013-03-13T11:59:47.313 回答