UDP パケットが (Wireshark 経由で) 期待どおりに到着していることを知っており、Windows ファイアウォールをオフにしているにもかかわらず、私の非常に単純な Java コードはパケットを受信しません。
byte[] buffer = new byte[2048];
DatagramSocket socket = new DatagramSocket( 50000 );
DatagramPacket packet = new DatagramPacket( buffer, buffer.length );
socket.receive( packet );
私のマシンには 3 つのネットワーク アダプタがあるので、IP について非常に具体的にしようとしました。パケットが到着したローカルアドレスを調べるようにソケットを設定しようとしましたが、何も受信しませんでした。また、パケットが送信されていたリモート IP にソケットを接続しようとしましたが、何も受信しませんでした。その間ずっと、Wireshark は 1 秒あたり 160 パケットすべてが到着していることを確認しています...
私の他の唯一の考えは、送信側でUDPチェックサムを計算していないということでした(UDPパケットは組み込みシステムで「手作業で」組み立てられています)、0x0000に設定されているだけです-DatagramSocket
チェックサムなしでUDPパケットを破棄します! ?
@Andreasの提案に従って、問題の診断を支援する簡単なテストサーバーを作成しました。
InetAddress outAddr = InetAddress.getLocalHost();
InetAddress inAddr = InetAddress.getByName( "192.178.178.0" );
byte[] buffer = ( "Hello" ).getBytes();
DatagramSocket socket = new DatagramSocket( 50000, outAddr );
while ( true ) {
DatagramPacket packet = new DatagramPacket( buffer, buffer.length,
inAddr, 50000 );
socket.send( packet );
try {
Thread.sleep( 500 );
} catch ( InterruptedException e ) {
// Ignore.
}
}
Wireshark は、すべてを受信していることに忠実に注意しますが、受信 IP が明示的に設定されている場合でも、クライアントはまだ受信していません。
InetAddress inAddr = InetAddress.getByName( "192.178.178.0" );
DatagramSocket socket = new DatagramSocket( 50000, inAddr );
...
socket.receive( packet );
奇妙なことですが、送受信にどちらが使用されているかを確認するNetworkInterface
と、Java は正しいもの (192.178.178.0 を「所有している」もの) を報告しますが、Wireshark は別のネットワーク デバイス上のテスト サーバー パケットしか認識しません。 . 何が起こっているかについてのアイデアはありますか?