编辑:抱歉,不小心发布了一个不同问题的标题.固定.
大家好,
我正在使用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}");
套接字服务器的相关部分如下(请注意<<>>运算符已超载):
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");