我使用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) }
很长一段时间以来一直困扰着我。任何帮助将不胜感激。
答案 0 :(得分:0)
如果您正在使用流函数进行套接字通信,您可能希望使用fflush()
来确保实际在线路上发送数据,否则这个项目可能只是位于流输出缓冲区中。
这不应该是socket_send()
的问题。既然你说结果是一样的,我建议你重新检查一下你正在使用的应用程序协议 - 另一方可能期望有超过4个字节来生成响应。 / p>
最后一种方法总是像tcpdump(1)
或wireshark这样的数据包嗅探器。