NoRouteToHostException с DatagramChannel, связанным с подстановочным адресом - PullRequest
0 голосов
/ 16 сентября 2011

У меня возникла проблема с этой комбинацией: я хотел бы привязать каналы передачи и получения дейтаграмм к выбранному системой порту и IP ( не loopback и не localhost). В следующем примере все работает нормально, когда я использую «старый ввод / вывод», также известный как DatagramSocket (случай 1), но не работает с NoRouteToHostException, используя NIO, также известный как DatagramChannel (случай 3).

Мой API основан на InterruptibleChannel, а сокет, созданный с помощью new DatagramSocket, не имеет связанного канала, поэтому мне нужно, чтобы это работало с DatagramChannel.open(). Глупый обходной путь - это случай 2, когда я временно «подключаю» канал. Так что это может помочь ответить на вопрос, почему сбой в 3-м случае ...

import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;

public class Test {
   public static void main( String[] args ) {
      try { test(); } catch( Exception e ) { e.printStackTrace(); }
   }    
   public static void test() throws IOException {   
      DatagramChannel tgt = DatagramChannel.open();
      tgt.socket().bind( new InetSocketAddress( 0 ));
      SocketAddress tgtAddr = tgt.socket().getLocalSocketAddress();          
      byte[] data = new byte[] { 1, 2, 3, 4 };

      System.out.println( "Sending 1..." ); // ok!
      DatagramSocket src1 = new DatagramSocket( new InetSocketAddress( 0 ));
      src1.send( new DatagramPacket( data, data.length, tgtAddr ));

      System.out.println( "Sending 2..." ); // ok!
      DatagramChannel src2 = DatagramChannel.open();
      src2.socket().bind( new InetSocketAddress( 0 ));
      src2.connect( tgtAddr );
      ByteBuffer b = ByteBuffer.wrap( data );
      src2.write( b );
      src2.disconnect();

      System.out.println( "Sending 3..." ); // fails!
      DatagramChannel src3 = DatagramChannel.open();
      src3.socket().bind( new InetSocketAddress( 0 ));
      src3.socket().send( new DatagramPacket( data, data.length, tgtAddr ));
   }
}

1 Ответ

0 голосов
/ 16 сентября 2011

Вы пытаетесь отправить на адрес, к которому привязан 'tgt', который является подстановочным адресом. Я удивлен, что это работает вообще. Вы должны указать правильный целевой IP-адрес, а не 0.0.0.0.

...