java - DatagramChannel 绑定(bind)到通配符地址的 NoRouteToHostException

标签 java networking udp nio datagram

我在使用此组合时遇到问题:我想将发送和接收数据报 channel 绑定(bind)到系统选择的端口和 IP(不是 环回和不是 localhost )。在下面的示例中,当我使用“旧 I/O”又名 DatagramSocket (情况 1)时,这一切正常,但使用 NIO 又名 时会失败,并出现 NoRouteToHostException DatagramChannel(案例 3)。

我的API全部基于InterruptibleChannel,并且通过new DatagramSocket创建的套接字没有关联的 channel ,所以我需要让它与一起工作DatagramChannel.open()。一个愚蠢的解决方法是情况 2,我暂时“连接” channel 。所以这可能有助于回答案例 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 ));
   }
}

最佳答案

您正在尝试发送到“tgt”绑定(bind)的地址,这是通配符地址。我很惊讶它竟然有效。您必须提供正确的目标 IP 地址,而不是 0.0.0.0。

关于java - DatagramChannel 绑定(bind)到通配符地址的 NoRouteToHostException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7439577/

相关文章:

iOS - 从套接字获取 CFReadStream/CFWriteStream

c - Epoll 是否可以与 UDP 监听套接字一起使用以实现事件驱动的 UDP 服务器

c - UDP 多套接字接收数据并高效处理 - C & Linux

java - MySQL连接池

java - TabLayout 图标大小未正确缩放

c++ - 通过 UDP 丢帧

ios - 如何获取附近 wifi 网络的列表并能够从我们的 ios 应用程序连接到它们(为企业应用程序使用私有(private) API)?

java - Hibernate 为 Oracle 生成导致 ORA-02014 的查询

java - 使用Spring中的Aspects计算方法处理时间

sockets - 从套接字部分读取