0

私は単純なクライアント/サーバー TCP 通信ストリームを作成していますが、私の問題は、サーバー アプリを強制終了すると、クライアント アプリが正常に終了することです。STDERR への出力はなく、recv() は 0 または -1 を返さず、クライアント アプリは停止するだけです。

一方、クライアント アプリを強制終了すると、サーバー アプリは send() から 0 の戻り値を取得しますが、これは想定どおりです。

この問題に関するヘルプは大歓迎です!

4

2 に答える 2

0

クライアント アプリケーションを強制終了すると、オペレーティング システムは開いているすべての IO ハンドルを閉じます。この方法で TCP 接続が閉じられると、そのピアに FIN が送信されます。この点で、クライアントを強制終了することは、クライアントを正常に終了させることと区別がつきません。

TCP 接続が確立されると、「クライアント」と「サーバー」の概念はなくなります。これは単純な双方向通信チャネルです。ネットワーク/ソケットの観点からの結果は、どちらの側が中止されても同じです。

動作に違いがある場合、それは 2 つのアプリケーションのプログラミングにあります。ブロッキングrecv()呼び出しは、接続が閉じられたときに使用可能だったバイト数を返すか、エラーの場合は -1 を返す必要があります。

strace <client program and args>プロセスで使用して、そのシステムコールで何が起こっているかを正確に確認することをお勧めします。

于 2011-06-15T09:40:17.637 に答える
0

これはおそらくSIGPIPE、もう一方の端によって閉じられた接続に書き込もうとしたときに発生する発生によるものです。デフォルトでSIGPIPEは、プロセスを即座に終了し、大量のシステム リソースが浪費され、どこにも行かない出力を生成するのを防ぎます。これを防ぐには、シグナルを無視します。

signal(SIGPIPE, SIG_IGN);

これを行うと、sendコールは期待どおりに動作するはずです。

于 2011-06-13T22:16:07.617 に答える