【问题标题】:With Java DatagramSockets, can I connect two different sockets to the same local port but on different local addresses?使用 Java DatagramSockets,我可以将两个不同的套接字连接到同一个本地端口但在不同的本地地址上吗?
【发布时间】:2015-06-06 15:38:36
【问题描述】:

使用 Java DatagramSockets,我可以将两个不同的套接字连接到同一个本地端口但在两个不同的本地地址上吗?

我有这种情况。我的电脑连接了 WiFi 卡和以太网电缆。 Wifi 和以太网都在工作,它们有两个不同的地址(“192.168.10.104”和“192.168.10.108”)。当我创建一对 DatagramSocket 时,我会这样做:

final String wiFiCardAddressName = "192.168.10.104";
final String ethernetAddressName = "192.168.10.108";
final InetAddress wiFiCardAddress = InetAddress.getByName(wiFiCardAddressName);
final InetAddress ethernetAddress = InetAddress.getByName(ethernetAddressName)
DatagramSocket datagramSocket1 = DatagramSocket(8000, wiFiCardAddress);
DatagramSocket datagramSocket2 = DatagramSocket(8000, ethernetAddress);
// ...

这行得通吗?一个套接字的所有数据包都通过 WiFi,而另一个套接字的所有数据包都通过以太网吗?为什么或者为什么不?

【问题讨论】:

  • 是的,你可以。是的,它确实有效。它之所以有效,是因为这就是路由的工作方式。 (如果您希望它像它一样工作。)这是一个 IP 的功能 - 在 TCP 或 UDP 下 - 通常。
  • 那么如果我断开以太网,那么两个datagramSockets之一将停止工作,另一个将继续工作?
  • 是的,如果您断开接口,它将被..断开。如果严格谈论路由(即仍然可以通过另一个接口建立连接),它会有点复杂,但是这个问题询问 binding 并且绑定是每个接口的(甚至 '* ' 可以被认为是每个/任何接口)。
  • 如果我绑定到通配符地址怎么办。数据报套接字(8000,“0.0.0.0”);这是否意味着我的DatagramSocket无论来自以太网还是WiFi地址都会收到数据包?
  • 如果我绑定到 (8000, "0.0.0.0") 然后断开以太网,在端口 8000 上获取一个数据包,重新连接以太网,断开 WiFi,在端口 8000 上获取另一个数据包,会我会成功获取两个数据包,一个是以太网断开的数据包,另一个是 WiFi 断开的数据包?

标签: java sockets udp


【解决方案1】:

可以,只要两个地址都不是 0.0.0.0。

如果我绑定到 (8000, "0.0.0.0") 然后断开以太网,在端口 8000 上获取一个数据包,重新连接以太网,断开 WiFi,在端口 8000 上获取另一个数据包,我会成功获得两者数据包,以太网断开的数据包和WiFi断开的数据包?

问题不清楚。如果您的意思是 wifi 数据包在 wifi 连接并且以太网断开连接时到达,然后以太网数据包在以太网连接并且 wifi 断开连接时到达,那么是的,您应该通过连接的接口获得任何到达。 0.0.0.0 有时被称为“全部”,但它实际上意味着“任何”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2012-12-07
    • 2016-11-01
    • 2012-06-23
    • 1970-01-01
    • 2013-02-14
    相关资源
    最近更新 更多