fread挂起 - PHP

时间:2012-08-30 14:40:14

标签: sockets

我使用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) } 

很长一段时间以来一直困扰着我。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

这不应该是socket_send()的问题。既然你说结果是一样的,我建议你重新检查一下你正在使用的应用程序协议 - 另一方可能期望有超过4个字节来生成响应。 / p>

最后一种方法总是像tcpdump(1)wireshark这样的数据包嗅探器。