2009-06-18 9 views
4

私は何年もの間ソケットプログラミングを行ってきましたが、今までTCPを使ってメッセージを逃したことはありませんでした。私はjavaサーバとC言語のクライアントを持っています - どちらもlocalhostです。彼らは文字列として短いメッセージを前後に送信し、その間にいくつかの遅延があります。私はメッセージがクライアント側に決して届かない特定のケースが1つあります。それは再現可能ですが、マシンには妙に変わっています。Missed Socket Message

もう少し詳しく説明すると、私はサーバー側をデバッグし、sendに続いてフラッシュを見ることができます。私はクライアントに接続して、選択呼び出しを(ループで)歩くことができますが、それは決して表示されません。誰かがこれを経験して、コーディングエラー以外の説明がありますか?

つまり、接続されたソケットがあり、一方の側に書き込みを行い、もう一方の側に読み込みを行った場合、中間に何が起こりますか?

もう1つの詳細 - ループバックインターフェイスでtcpdumpを使用しましたが、見逃したメッセージが表示されます。

+0

クライアントはマルチスレッドですか?別のスレッドがそのメッセージでselect()を実行している可能性はありますか?また、どのOSを使用していますか? –

+0

私は、別のスレッドがそのスレッドを選択できるとは思わない。これはLinux上です。良いアイデア - 私はカウンターで確認しました。 – AdamC

答えて

1

最後にもう少し盗聴した後、私は問題を発見しました。 2つのメッセージが読まれる前に送信されていた(時には、まれに...)ので、両方のメッセージが読み込まれたが、最初のメッセージだけが処理された。これは、2番目のメッセージが到着しなかったかのように見える理由です。受信バッファに埋め込まれました。

+1

qrdlは優れた点です。 UDPは1書き込み== 1読み取りを保証しますが、TCPは明示的に(スループットを向上させるために)はしません。 –

+0

フロー制御に関する良い点 - これはこの種のエラーを防止するのに最適な方法ですが、私の経験上、BSを呼び出すことは失礼です。このような理由で私はあまりにも愚かな間違いだったので、私はほとんど回答を投稿しませんでしたが、誰かにこれを見てアイディアを見たいと思っていました。 – AdamC

4

私はこれが以前のSMTPトランザクションで起こっているのを見ました。あなたはそのマシンでウイルススキャナを実行していますか?もしそうなら、それをオフにして、違いがあるかどうかを見てください。

それ以外の場合は、Wiresharkをインストールして実際に何が起こっているかを確認することをおすすめします。

+0

彼はtcpdumpを使い、見つからなかったメッセージを見た。 Wiresharkは詳細を提供しますが、大きな違いはありません。 – bortzmeyer