2013-03-13 57 views
0

嗨下面的socket_read函数存在问题,它在读完数据后不会返回空字符串''。在第二次调用socket_read()时,它只是挂在那里,页面继续在浏览器中加载而不返回。 它可以在服务器关闭连接的情况下工作,服务器是否必须关闭客户端套接字?由于PHP 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); 

回答

1

是的,这正是我期望它做的事情 - socket_read(),除非你打开一个二进制服务器用“\ 0”响应绝不会返回一个空字符串。

您似乎在尝试编写HTTP客户端。如果你是,立即停止,扔掉你的代码,并阅读Curl扩展。 HTTP不是一个简单的协议,你仍然有很多东西需要了解简单的东西是如何工作的。您正在依赖套接字状态和数据格式来确定数据流 - 但HTTP不使用。

如果您想了解HTTP如何工作,那么在互联网上有很多文档 - RFC是必须的,但不是一个温和的介绍。如果你的目标是开发一个应用程序,然后使用curl(甚至HTTP流包装)。

+0

嗨,我确实从服务器发送了'\ 0',但它仍然不返回空字符串。或者,我只需从服务器发送##,然后在php中检查##以结束循环。 我知道curl,而不是试图写一个HTTP客户端。我只想让php与我写的C++ winsock应用程序通信。 感谢您的帮助。 – William 2013-03-14 03:56:22