Networking 当两台计算机侦听同一端口,路由器通过该端口接收数据包时会发生什么情况

Networking 当两台计算机侦听同一端口,路由器通过该端口接收数据包时会发生什么情况,networking,tcp,listener,port,Networking,Tcp,Listener,Port,我要问的是,如果两台计算机监听同一端口,一个信息包通过WAN Ip和同一端口进入路由器。数据包会同时发送到两台计算机吗?也不一个还是另一个 即 计算机1-(内部IP)->192.168.1.3-(侦听端口)->4444 计算机2-(内部IP)->192.168.1.2-(侦听端口)->4444 计算机3-(连接和发送)->24.157.358.45:4444 数据包->计算机1和计算机2 VB6中的代码是: LAN.LocalPort = 4444 LAN.Protocol = sckTCPPr

我要问的是,如果两台计算机监听同一端口,一个信息包通过WAN Ip和同一端口进入路由器。数据包会同时发送到两台计算机吗?也不一个还是另一个

计算机1-(内部IP)->192.168.1.3-(侦听端口)->4444

计算机2-(内部IP)->192.168.1.2-(侦听端口)->4444

计算机3-(连接和发送)->24.157.358.45:4444

数据包->计算机1和计算机2

VB6中的代码是:

LAN.LocalPort = 4444
LAN.Protocol = sckTCPProtocol
LAN.Listen
我正在VB6 Professional中的Microsoft WinSock Control 6.0中使用WinSock对象


如果有什么需要澄清的,我非常乐意。

根据我对路由器的了解,除非设置了端口转发,否则路由器将丢弃在该端口上发送的任何数据包


如果设置了端口转发,则只能设置其中一台计算机来接收数据包。

除非已建立通信,否则路由器不会向任何一台计算机发送入站数据包

如果192.168.1.3从端口4444呼叫其他机器(如4.5.6.7),路由器将在其外部地址上分配一个任意端口(如24.157.358.45[sic]:5555),并将数据包传递到4.5.6.7。4.5.6.7将向24.157.358.45:5555发送回复数据包——因为这是它知道的唯一地址——路由器将把这些数据包转发到192.168.1.3:4444

这是正常的事情,但是这个方案还有很多额外的细节,可以通过欺骗与路由器后面的机器建立通信


在具有公共地址的路由器后面拥有具有私有IP地址的机器的系统称为;这是一个相当深奥的话题

如果数据包是与路由器后面运行的服务器建立新TCP连接的入站请求,则路由器必须配置明确的端口转发规则,可以在路由器配置中静态配置,也可以通过uPNP或SNMP动态配置,告知路由器将24.157.358.45:4444上的入站数据包路由到何处,发送至192.168.1.2:4444或192.168.1.3:4444,否则将丢弃该数据包。因此,不,两个侦听服务器将看不到相同的数据包


一旦建立TCP连接,路由器就会知道哪些特定的LAN机器与哪些连接相关联,并相应地路由属于这些连接的传入数据包。

前面的答案是正确的,您需要启用端口转发。如果未启用,路由器上的端口4444将关闭

听起来您有多台服务器,并且希望转发到当前打开的任何服务器。这是不可能的(*),路由器不关心PC1或PC2是否正在侦听端口4444,它只会将所有内容转发到端口转发中配置的地址

(*):可以,但需要一些额外的工作

解决方案1:诱使路由器认为只有一台服务器。为PC1和PC2提供一个具有相同IP地址的虚拟网络接口,并转发到该地址。请确保仅启用了其中一个接口,网络中存在重复的IP地址可能会导致意外行为


解决方案2:让路由器关心哪个服务器在运行。您需要编写一个在路由器(或另一台服务器)上运行的程序,该程序可以检测哪个服务器在运行,并相应地转发数据包。如果您使用的是Linux,那么iptables程序值得一看

该死,我想我还得用一些服务器软件来连接它。谢谢你的帮助,好的。我想我一定会同意服务器的想法。许多路由器都有一个“DMZ”主机,可以配置为接收所有其他“未知”流量。但是你只能有一个。