【发布时间】:2011-12-04 11:08:33
【问题描述】:
在 linux 中使用 socket_read() 时,我遇到了一个非常奇怪的行为。
我正在使用 2048 缓冲区限制的 socket_read。
在我的 Windows 系统上,它获得整个响应,而在我的 Linux 服务器上,它只获得响应的第一个字节。
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!socket_connect($sock, 'my-server.dyndns.org', 8888)) {
die('no connect');
}
$req = 'request';
socket_write($sock, $req);
if (false !== ($buf = socket_read($sock, 2048)) {
echo $buf; // This only contains the first byte of the response.
}
socket_close($sock);
如果我再次调用 socket_read() 它会得到字符串的其余部分:
// This works:
while((false !== ($buf = socket_read($sock, 2048)))) {
echo "Read ".strlen($buf)." bytes from socket_read().\n";
if ($buf == "") break;
$b .= $buf;
sleep(1);
}
/* Output:
*
* Read 1 bytes from socket_read().
* Read 307 bytes from socket_read().
* Read 0 bytes from socket_read().
* Done.
*/
如果我在调用 socket_read() 之前等待 2 秒,我也会得到一个有效的响应:
// This also works:
sleep(2);
if (false !== ($buf = socket_read($sock, 2048)) {
echo $buf; // all 308 bytes are read correctly.
}
socket_read() 不应该等待缓冲区变满,还是等待字符串结束?
我做错了什么?
【问题讨论】:
-
你的问题是什么?您是否想知道为什么在写入后需要等待一段时间才能从套接字读取内容?
-
问题是我不能相信上述解决方案。我不能等待任意时间并假设响应是有效的。另一个解决方案有类似的问题:如果输出是分块发送的,我可能会在所有读取完成之前中断读取循环。
-
嗯,你总是需要等待响应。您可以检查是否有数据,如果没有,请再试一次(一次又一次)。自己构建缓冲区,同时解析和处理套接字错误。
-
@hakre 我无法确定输出何时完成。
-
当然,这就是您需要等待的原因。是网络,你需要检查是否有东西可以阅读。