php - 无法从套接字读取(挂起)

标签 php c++ sockets

我正在使用 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/

相关文章:

php - 如何使用 php 删除数组中的特定键?

c++ - 如何在不退出和丢失断点的情况下在 gdb 中重新加载重新编译的二进制文件?

linux - packet mmap发送包格式

c++ - 通过指向引用的指针修改类变量

php - 负载平衡和socket.js

java - 网络不好时的socket : Should I check connection state first or just send with retry mechanism?

php - HTML 到 Wordpress : Add category block over featured image

php - 将表 1 中的列值定义为表 2 中的值

php - Jquery 使网页的某些部分变灰

c++ - 在 C++ 中从屏幕选择创建位图时的黑色图像