【发布时间】:2011-05-07 11:07:59
【问题描述】:
我正在使用 PHP 连接到本地 C++ 套接字服务器,以保持 Web 应用程序和几个守护程序之间的状态。我可以向套接字服务器发送数据,但不能从它接收;它只是阻塞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 不想玩得很好。感谢您提出任何想法/建议。
【问题讨论】:
-
您在 C++ 中使用什么套接字库,或者您是否创建了自己的(*nix 或 Windows)?另外,错误是什么?它只是永远阻塞 sock >> 数据还是发生了更多事情?附加说明;我已经有一段时间没有使用 PHP 与 C++ 服务器进行通信了,但是您的服务器是否向套接字发送了一个终止,所以它告诉 PHP 停止读取?您的循环将在 PHP 中连续读取,直到服务器告诉它套接字已完成发送信息;请注意,这不是实时更新(因为它会在数据完全收集并存储在您的 var 中后打印数据)。
-
这可能只是您的代码中缺少的,但您是否先
socket_create$sock? -
另外,我在您的代码中没有看到这一点,但您需要在循环完成时打印 $str。
-
哎呀,我不小心从我的代码中遗漏了
socket_create()- 上面已更新。我应该早点澄清一下,抱歉 - 这是在 *NIX 上的。本身没有任何错误;服务器本身工作正常(我可以 telnet 并且它按预期工作) - 它是 PHP 的socket_read()无限期挂起。套接字服务器只是我拼凑起来的一个临时服务器,因为我找不到可以使用的好服务器(任何建议都会很棒)。