2012-03-21 8 views
1

私は、受信UDPブロードキャストメッセージの特定のポートでリッスンする必要があるクライアントを持っています。これは、ポートにバインドされたDatagramSocketオブジェクトを1500msのsetSoTimeoutで初期化することで実現します。ネットワーク負荷が高い状態でJava DatagramSocketが応答を停止する

while (true) { 
    try{ 
     DatagramSocket datagramSocket = new DatagramSocket(PORT); 

     byte[] buffer = new byte[BUFF_LEN]; 
     DatagramPacket packet = new DatagramPacket(buffer, buffer.length); 

     datagramSocket.receive(packet); 

     [handoff packet to internal buffer to await processing] 

    } catch (SocketTimeoutException timeout) { 
     ... 
    } catch [other exceptions] 
} 

これはきれいな教科書であり、すべて正常に機能します。最近のネットワーク負荷テストでは、アプリケーションが特定のデータグラムを受信して​​いないことが判明し、ネットワークが混雑するほど問題は悪化しました。

さらに掘り下げると、.receive()が呼び出されるたびにタイムアウトが発生していることが判明しました。ほとんどの場合、ポートに何も到着していないかのようです。 しかし、同じマシン上でWiresharkを実行すると、これは真ではないことがわかります、期待どおりのサイズと内容の整形済みパケットがいつものように到着しています。何とかデータグラムがアプリケーション層への道を見いださなかっただけです。

ネットワークトラフィックが急激に減少すると、この問題は直ちに解消され、Javaアプリケーションはすぐに通常通りにパケットを受信して​​処理できます。

誰でも問題が発生している可能性がありますか、この問題のトラブルシューティングをさらに進めるにはどうすればよいですか?

ありがとうございます。

答えて

1

おそらく、ソフトウェアファイアウォールでのUDPフラッドプロテクションは?

また、UDPは設計上信頼できないプロトコルです。負荷のためにネットワーク層がパケットを破棄している可能性があります。

+0

wiresharkが受信データをうまく記録している場合でも、これは可能ですか? 私の場合と同じ問題を抱えているのは、グーグルの時間が1人にすぎないからです。 http://social.technet.microsoft.com/Forums/en/winserverTS/thread/06a33876-fb45-4bfe-90c2-d27a27e48e3f – Gary

+0

正直言ってわかりません。あなたは、ドライバー、薄いネットワークカード、面白いOSのリビジョン、または何かを実行している可能性があります。 Wiresharkがどのようにデータを実際に読み取るかを知らないと、負荷に関連して再現性があると判断して、ファイアウォールやスロットルソリューションの可能性が高いと思います。 – mcfinnigan

0

パケットがホストに到着している場合、ソケット送信バッファがいっぱいになると、パケットはホストによって破棄されます。これは、アプリケーションが入力に追いついていない場合に発生します。

0

私はしばしばJavaでプログラムしませんので、ここで何か不足していますが、なぜループ内にnew DatagramSocketを呼び出していますか?それは、システムリソースを急速に使い果たすような、すべてのデータグラム用の新しいソケットを作成するようです。

+0

私は擬似コードを責めます。実際のコードはソケットを一度定義します。とにかくそれを指摘してくれてありがとう。 – Gary

関連する問題