【问题标题】:Java UDP cant bind to local IP address(Ethernet)Java UDP 无法绑定到本地 IP 地址(以太网)
【发布时间】:2018-03-27 15:02:50
【问题描述】:

我的笔记本电脑已通过以太网电缆和 wifi 连接 我的以太网 IP:192.168.18.32 我的 wifi ip: 192.168.18.167 现在我想使用wifi网络接口通过java发送一个udp数据包。 我读到,如果我绑定到相应的 ip,则相应的接口将用于发送 udp 数据包,即如果我绑定到 ip 192.168.18.167,则 udp 数据包将使用 wifi 接口发送

我的代码是:

  final String wiFiCardAddressName = "192.168.18.32";
  final String ethernetAddressName = "192.168.18.167";
  final InetAddress wiFiCardAddress = InetAddress.getByName(wiFiCardAddressName);
  final InetAddress ethernetAddress = InetAddress.getByName(ethernetAddressName);
  DatagramSocket datagramSocketWifi = new DatagramSocket(10000, wiFiCardAddress);
  System.out.println(ethernetAddress);
  DatagramSocket datagramSocketEt = new DatagramSocket(6666, ethernetAddress);

      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, serverPort);

但无论何时调用此发送方法

     datagramSocketWifi.send(sendPacket);
     datagramSocketet.send(sendPacket);

它显示以下错误:

Exception in thread "main" java.net.BindException: Cannot assign requested address: Datagram send failed    
at java.net.DualStackPlainDatagramSocketImpl.socketSend(Native Method)
at java.net.DualStackPlainDatagramSocketImpl.send(Unknown Source)
at java.net.DatagramSocket.send(Unknown Source)
at socket_test.Client_UDP_Bind.main(Client_UDP_Bind.java:50)

【问题讨论】:

  • 你试过stackoverflow.com/questions/8965155/…的答案了吗?
  • 这两个发送中哪个会抛出异常?你想在哪里发送数据报?发送套接字绑定的接口是否可以真正发送到该目的地?
  • 是的。我已经看到了,但这并不能解决我的问题
  • @alalamin 我并不感到惊讶。有一半的答案不正确或不相关。奇怪的是,您在发送时遇到绑定异常,而不是在绑定/创建时。你确定这是真正的代码吗?
  • 请注意,DatagramSocket 的构造函数的 Javadoc 中存在错误,这些构造函数采用 InetAddressSocketAddress 参数。 “通配符”地址不是“内核选择的地址”。它是 INADDR_ANY,具体表示 任何 IP 地址,在主机作为本地地址拥有的所有当前和未来 IP 地址中。

标签: java interface udp ip bind


【解决方案1】:

当我将服务器移动到外部主机(即 IP)时,我的服务器正在本地主机上运行,​​即 127.0.0.1,然后同样的代码工作。我可以使用ehternet或wife发送数据包,并且可以在wireshark中看到日志。

【讨论】:

  • 您的服务器?什么服务器?您的服务器“在本地主机上运行,​​即 127.0.0.1”如何?您在问题中没有提及服务器。您展示的唯一代码是not'running on 127.0.0.1'。
  • EJP 对不起我的错误。我认为服务器是在 localhost 还是在外部服务器上运行并不重要
  • 我在问你这是什么意思,你还没有回答。在你澄清之前,你的回答和你的问题在这里都是无用的。
  • DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, serverPort);这里 IPAddress 是在 localhost 上运行的服务器 IP
  • 'Running on localhost' 要么没有意义,要么不会导致这个问题。您的意思是服务器的DatagramSocket绑定 到 127.0.0.1?事实上all这个问题和代码中其他地方的DatagramSockets应该绑定到通配符地址,它在API中表现为nullInetAddress,或者省略。
猜你喜欢
  • 2023-02-12
  • 1970-01-01
  • 2013-10-22
  • 2014-08-09
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 2017-05-14
  • 2016-10-24
相关资源
最近更新 更多