2

fsockopen($ host、$ port)を使用してソケットを作成し、fwriteを使用してデータを送信し、freadを使用してデータを読み取ろうとしました。fsockopenがソケットを正常に作成し、fwriteがデータをソケットに正常に送信したようです(正の数-4を返します)が、freadがハングします。データの読み取りを待っているようですが、理由がわかりません。fwriteが成功しました。fwriteとfreadの代わりにsocket_create、socket_connect、socket_send、socket_recvを使用してみましたが、同じことが起こります。

以下は私のコードの要約です:

$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 に答える