当网络上的所有计算机都具有相同的公共IP地址时,如何向特定计算机发送UDP数据包? [关闭]

2024-04-05

这就是问题,它非常简单(理解..):

我家里有 2 台电脑,它们都有相同的公共 IP 地址(例如 1.2.3.4)。

我在咖啡馆有一台计算机(不同的网络),因此它具有不同的公共 IP 地址。

我想从咖啡馆的计算机向我家里的一台计算机发送一条消息(例如“嗨”)。

我正在使用 Java,请为发送者考虑以下非常简单的程序(为了简单起见,我取消了异常处理):

我主要做的是:

sendPacket("hi");

我有

void sendPacket(String message){
    DatagramSocket myServerSocket = new DatagramSocket(9000);    // server socket
    byte[] sendData = new byte[message.length()];    // build msg
    sendData = message.getBytes();
    InetSocketAddress destSocketAddr = new InetSocketAddress("1.2.3.4", 9000);    // destination socket addr
    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, destSocketAddr);     // make packet 
    myServerSocket.send(sendPacket);    // send packet
}

如果我的监听器(接收器)在家里的两台计算机上运行(两台计算机都具有相同的公共 IP 地址 1.2.3.4),我如何指定我打算将此消息发送给哪一台?


如果您的两台家用计算机具有相同的公共 IP 地址,则意味着这些计算机正在使用 NAT 或网络地址解读 http://en.wikipedia.org/wiki/Network_address_translation(严格来说,这是端口地址转换或 NAT 过载,但通常简称为 NAT)。

这意味着,为了启动从外部到 NAT 内任何计算机的连接,转发端口必须在您的路由器(通常是调制解调器)中进行设置,以便将公共家庭 IP 地址的特定端口映射到家中的特定私有 IP 地址。

假设您家里有计算机 A 和 B,如下所示:

             Router / Modem
              192.168.0.1 
                  ||
       ++=========++========++
       ||                   ||
  Computer A           Computer B
  192.168.0.2          192.168.0.3

现在,假设您需要计算机 A 侦听 TCP 端口9000(端口主要可以是TCP或UDP),可以转发公共端口9000直接连接到计算机A9000 port:

Forward TCP/UDP on public port 9000 to private port 9000 on 192.168.0.2

要将消息发送到计算机 A,只需将其发送到1.2.3.4:9000。但是如果另一台电脑只监听端口怎么办9000也?您也不能分配公共端口9000因为它是由计算机 A 获取的。您可以这样做:

Forward TCP/UDP on public port 9001 to private port 9000 on 192.168.0.3

这样,计算机B仍然可以在端口上接收消息9000,但它们需要通过互联网发送到1.2.3.4:9001。当数据包进入(和离开!)您的家庭网络时,您的路由器的 NAT 会自动转换端口。

最后,发送者需要调整目标端口以便与 NAT 后面的不同机器“对话”。

希望这是有道理的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当网络上的所有计算机都具有相同的公共IP地址时,如何向特定计算机发送UDP数据包? [关闭] 的相关文章

随机推荐