2

我使用 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.
...

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

$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) } 

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

4

1 回答 1

0

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

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

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

于 2012-08-30T17:39:20.613 回答