0

(Infosys) サーバーと通信するクライアント プログラム (TCP ソケット) に IO::Socket::INET を使用しています。

my $SOCK = new IO::Socket::INET ( PeerAddr => 'xxx.xxx.xxx.xxx' , PeerPort => '5000', Proto => 'tcp', );

$Sent_Message = $MAIN::REQUEST_NO . $Bitmap .$main::Req_String ; 
$Total_Len = sprintf("%04d",length( $Sent_Message ) ) ; 

#my $FinalMessage = $Total_Len . $Sent_Message."\n" ; 
my $FinalMessage = $Total_Len . $Sent_Message ; 

print $SOCK $FinalMessage; 

行末に「\n」を付けてリクエストを送信しています。返信がありませんでした。サーバー側では、ログは応答がクライアントに送信されたことを示しています。

Wireshark と tcpdump を使用してパケットをチェックしていますが、システムはパケットを受信して​​いません。

'\n' なしでリクエストを送信しましたが、(すぐに) 正常に応答を受け取りました。

次に、さらに 3 つの要求を送信しました。最初の 1 つは '\n' 付きで、2 番目は '\n' なしです。

3 つの要求はすべて、サーバーからの応答を待っています。プロセス 1 を強制終了しました。「\n」でリクエストが送信されました。その後、他の 2 つのプロセスが応答を受け取ります。

同じクライアント コードが、'\n' なしでローカル サーバーに要求を送信しています。

サーバーにリクエストが届きません。(バッファはフラッシュされません)。

私の疑問は、 '\n' を使用してリクエストを送信する場合と '\n' を使用しない場合の違いは何ですか?

他の 2 つのプロセスがすぐに応答を受信しなかった理由。(「\n」なしでリクエストが送信されます) ?

問題は、行末に「\n」を付けて送信するリクエストであることがわかりました。

問題はサーバー側ですか、それともクライアント側ですか?

4

1 に答える 1

1

考えられる原因は2つあります。

  1. 長さは32ビット整数を送信する必要がありますが、4桁の10進文字列を送信しています。

  2. 改行が受信されるまで読み取るバガーレシーバーがあります。それは早く終わるか、(永遠ではないにしても)長く待つかもしれないので、ここでは完全に不適切です。

バッファリングの問題ではありません。IO :: Socket :: INETは、1.18(1997年にリリース)以降、ハンドルのバッファリングを無効にしています。

于 2013-03-19T09:31:11.223 に答える