我正在使用 PHP 连接到本地 C++ 套接字服务器,以保持网络应用程序和几个守护进程之间的状态。我可以向套接字服务器发送数据,但不能从中接收数据;它只是阻塞 socket_read()
并无限期挂起。我是不是忘记了一些愚蠢的东西(比如 NULL 字符或换行符的不同组合)? PHP 如下:
socket_connect($sock, $addr, $port);
socket_write($sock, 'Hello world');
$str = '';
while($resp = socket_read($sock, 1000))
$str .= $resp;
socket_close($sock);
die("Server said: {$str}");
socket服务器的相关部分如下(注意<<
和>>
运算符重载):
std::string data;
sock >> data;
sock << data << std::endl;
在哪里>>
电话 Socket::recv(std::string&)
和 >>
电话 Socket::send(const std::string&)
.
这在(例如)telnet 上工作正常,但 PHP 不想玩得很好。如有任何想法/建议,我们将不胜感激。
最佳答案
与大多数编程语言一样,PHP 中的套接字默认以阻塞模式打开,除非使用 socket_set_nonblock
另行设置。
这意味着除非发生超时/错误或接收到数据,否则 socket_read
将永远卡在那里。
由于您的终止字符似乎是一个新行,请尝试:
while($resp = socket_read($sock, 1000)) {
$str .= $resp;
if (strpos($str, "\n") !== false) break;
}
socket_close($sock);
die("Server said: $str");
关于php - 无法从套接字读取(挂起),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4137661/