2016-07-13 2 views
0

何らかの形でソケットから切断されているか、少なくともrecv()から返された値はゼロです。問題を引き金にするようなことから、私はそれが境界外のメモリ書き込みだと思う。しかし、私はソケットの値を出力していますが、破損していません。不正なメモリ書き込みにより、recv()がゼロを返す

recv()を呼び出さずに「切断」を検出できる方法はありますか(私はすでにバイトを読み取るために呼び出しているため、コード全体で何かを検索して、 "が起こる)?

無効なメモリ書き込みが原因でrecv()がゼロを返す可能性がありますが、ソケット記述子の値は変更されません。

+0

なぜ範囲外の書き込みによって問題が発生していると思いますか?この場合、tcpdump/wiresharkはネットワーク上で何を表示しますか? – dbush

+0

@dbushこれは、アプリケーションが多数のイベントを処理する場合にのみ発生するようです。イベントが少ない場合は切断されません。だから、私は "バッチ"を処理し、いくつかの大きなバッチが受信されたときに、問題が発生したように見えます。 – user997112

+0

あなたのコードが何をしているかを推測すると思いますか? 1)きれいにコンパイルする2)問題を示す投稿コード – user3629249

答えて

0

いいえ、あなたはソケットを厳密にから読み書きして調べます。見つけ出す他の(信頼できる)方法はありません。

不正なメモリ の書き込みによってrecv()がゼロを返す可能性がありますが、ソケット記述子の値は変更されません。

何かが間違っていた場合は、recv戻り-1と(EFAULTに、そのような場合には)それに応じerrnoをセットではなく0

あなたはネットワーク上でAddressSanitizerやvalgrind、Wiresharkなどのツールを使って分析することができます。

+0

アドレスサニタイザーを使いたいと思う投稿コードを強く提案する。私の他のSOの質問を参照してください:http://stackoverflow.com/questions/38357631/undefined-symbol-what-next – user997112

2

recvからの戻り値0は、ピアが接続の終了を閉じた(または少なくともshutdown経由で書き込みを終了した)ことを意味します。私はそれがあなたの側で記憶を壊すことと関係があると信じる理由を見ません。 recvは一般的に非常に薄いシステムラッパーですが、プログラムが未定義のビヘイビアを呼び出したとしても、ユーザ空間でできることがその動作に影響することはほとんどありません。

関連する問題