加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 14:13:02 所属栏目:PHP教程 来源:网络整理
导读:编辑:抱歉,不小心发布了一个不同问题的标题.固定. 大家好, 我正在使用PHP连接到本地C套接字服务器,以保持Web应用程序和几个守护进程之间的状态.我可以将数据发送到套接字服务器,但不能从它接收;它只是阻塞socket_read()并无限期挂起.我忘记了一些愚蠢的东西
编辑:抱歉,不小心发布了一个不同问题的标题.固定.

大家好,

我正在使用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");

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读