NoRouteToHostException与DatagramChannel绑定到通配符地址

时间:2011-09-16 02:37:24

标签: java networking udp nio datagram

我遇到了这个组合的问题:我想将发送和接收数据报通道绑定到系统选择端口和IP(环回和 localhost )。在下面的示例中,当我使用“旧I / O”又称DatagramSocket(案例1)时,这一切都很好,但是使用NIO aka NoRouteToHostExceptionDatagramChannel失败(案例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 :(得分:0)

您正在尝试发送到'tgt'绑定的地址,即通配符地址。我很惊讶它完全有效。您必须提供正确的目标IP地址,而不是0.0.0.0。