【问题标题】:fread hangs — PHPfread 挂起 - PHP
【发布时间】:2012-08-25 08:00:13
【问题描述】:

我使用 fsockopen($host,$port) 创建了一个套接字,使用 fwrite 发送数据,并尝试使用 fread 读取数据。看起来 fsockopen 成功创建了套接字, fwrite 成功地将数据发送到套接字(返回正数 - 4),但 fread 挂起。看起来它正在等待读取数据,但我不明白为什么.. fwrite 成功。我尝试使用 socket_create、socket_connect、socket_send 和 socket_recv 代替 fwrite 和 fread,但同样的事情发生了。

下面是我的代码摘要:

$socket = fsockopen($host,$port,$errno,$errstr);
if(!$socket){
     echo "$errstr ($errno)<br>";
}

...
$example; //string to send
fwrite($socket,pack("N",strlen($example)),4);
$result = fread($socket,4); <-- Hangs and eventually shuts down the server.
...

在那之前我几乎没有成功发送/读取代码..

$status = stream_get_meta_data($socket);
var_dump($status);

这会输出以下数组:

array(7) { 
["stream_type"]=> string(14) "tcp_socket/ssl" 
["mode"]=> string(2) "r+" 
["unread_bytes"]=> int(0) 
["seekable"]=> bool(false) 
["timed_out"]=> bool(false) 
["blocked"]=> bool(true) 
["eof"]=> bool(false) } 

困扰我很久了。任何帮助将不胜感激。

【问题讨论】:

    标签: sockets


    【解决方案1】:

    如果您使用流函数进行套接字通信,您可能希望使用fflush() 来确保您确实在线发送数据,否则这个缺少的项目可能只是位于流输出缓冲区中。

    这不应该是socket_send() 的问题。由于您说结果是相同的,我建议重新检查您正在使用哪种类型的 应用程序协议 - 另一方可能期望超过 4 个字节来生成响应。

    最后的手段总是像 tcpdump(1)wireshark 这样的数据包嗅探器。

    【讨论】:

    • 非常感谢您的回复。我终于解决了我的问题,这是由于我的愚蠢错误......我不得不向套接字发送另一个数据,但我没有。你的回答仍然帮助我尝试不同的东西,我学到了新的东西,比如 fflush、tcpdump 和 wireshark。再次感谢您!
    • 这就是我在回答的第二部分中所说的。你也可以接受答案,你知道... :)
    • 对不起,我不知道如何接受您的回答。我刚刚想通了!非常感谢你的帮助! :)
    猜你喜欢
    • 1970-01-01
    • 2012-05-14
    • 2011-09-12
    • 2023-04-11
    • 2011-10-09
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多