2011-08-04 10 views
4

Linux TCPソケット経由で通信するネットワークアプリケーションを作成します。私は最近、私のアプリケーションをクラッシュさせるシステムコールを送信することに気づいた。両方のピアが稼働しているときはうまく動作します(現在クラッシュ復旧をテスト中です)。しかし、1つのピアがダウンすると、このコードを実行するとクラッシュします。Linux TCPソケットクラッシュ

fprintf(stderr, "out_tcp %d\n", out_tcp); 
    if(send(out_tcp, &packet, sizeof(packet), 0) == -1) 
     fprintf(stderr, "send TCP error"); 
    fprintf(stderr, "after send"); 

ソケットはすでに準備され、接続されており、2番目のピアがダウンする前に数回実行されました。私はこのコードが-1の値を返すことを期待していますが、出力では "out_tcp 11"しか生成せずにアプリケーションを終了します。エラーメッセージはありません。送信された戻り値はありません。私はそれをValgrindの下で実行します。アプリケーションは正常に終了します。エラー/警告メッセージは表示されません。

誰でもデバッグ方法を知っていますか?使用するツールは?私は情報が得られないので、これにかなり拘束されています。事前 Harnen

+1

ホープあなたは、シグナリングを使用していますか?あなたは 'gdb'でそれをチェックしましたか? –

+1

Valgrind?これはメモリリークではなく、 'gdb'の下で実行します。 'SIG_PIPE'のために終了しているかもしれません。 –

+2

[SIGPIPEを防止する方法やサーバーの終了を防ぐ方法](http://stackoverflow.com/questions/6821469/how-to-prevent-sigpipe-or-prevent-the-server-from-ending) –

答えて

6

あなたのアプリケーションがSIGPIPEを無視しているようです。詳細については、このスレッドを参照してください。

How to prevent SIGPIPEs (or handle them properly)

+0

SIGPIPEを無視すると助けになりました!ありがとう! – harnen

0

おかげで、あなたがエラー条件について(細かいマニュアルを読む)RTFMしようとしたことがありますか?信号を捕まえるか無視しますか? errnoグローバル変数はどうですか?

man send 

は、さらにTCPは、したがって、あなたが特別なフラグを必要としない場合は()()、書き込み、読み出しのような通常のストリーミングアクセスコマンドを使用することが推奨されるストリーミングプロトコルです。

+0

しました。送信してもアプリケーションが終了しない場合は、何かをすることは難しいです(エラーをチェックしてください)。 – harnen

1

が解決:

if(send(out_tcp, &packet, sizeof(packet), **MSG_EOR|MSG_NOSIGNAL**) == -1) 

以下のように送信機能で 使用MSG_EORMSG_NOSIGNALflagはそれが