嗨,下面的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);
答案 0 :(得分:1)
是的,这正是我期望它做的 - socket_read()将永远不会返回空字符串,除非你打开它是二进制文件,服务器以'\ 0'响应。
您似乎正在尝试编写HTTP客户端。如果你是,立即停止,抛弃你的代码并阅读Curl扩展。 HTTP不是一个简单的协议,你仍然需要了解很多简单的东西。您正在依靠套接字状态和数据格式来确定数据流 - 但HTTP不使用。
如果你想了解HTTP是如何工作的,那么互联网上有很多文档 - RFC是必须的,但不是一个温和的介绍。如果您的目标是开发应用程序,那么使用curl(甚至HTTP流包装器)。