gpt4 book ai didi

PHP socket_read() 只获取流的第一个字节

转载 作者:太空狗 更新时间:2023-10-29 12:07:03 26 4
gpt4 key购买 nike

在 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() 不应该等待缓冲区变满,或者等待字符串结束吗?

我做错了什么?

最佳答案

众所周知,Linux 上的网络堆栈比 Windows 上的网络堆栈更好(更快)(这是主观的,我们只是说:它的行为不同)。另一方面,这意味着您的代码也需要处理差异。

套接字不是实时的,而是异步的。因此,如果您向套接字写入内容,您不能期望您已经可以读取它。您需要给远程守护进程一些时间来实际响应您的写入。

只有远程端确实向您的套接字写入了一些内容并且网络已经传输了该数据,您才能读取它。

关于PHP socket_read() 只获取流的第一个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7712256/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com