所以,我用c ++制作了一个客户端和一个服务器。我的服务器的端口设置为htons(54000)。我的客户也有端口htons(54000)。
我的问题是,当我尝试将客户端连接到我的机器(托管服务器的机器,机器ip是:例如80.60.117.24)时,什么都没有发生!
我发现我需要使用端口转发。我的路由器是Huawei B525-23。我试图将端口从WAN端口54000转发到LAN端口54000,而我的计算机的本地IP:192.168.8.50。
嗯,它不起作用。
尽管它可以工作,但服务器和客户端位于同一局域网中。 (我将服务器在客户端上的IP地址设置为192.168.8.50(我的机器,服务器托管在此处)。
// SERVER.cpp
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(54000);
hint.sin_addr.s_addr = inet_addr("0.0.0.0");
bind(listening, (sockaddr*)& hint, sizeof(hint));
listen(listening, SOMAXCONN);
// CLIENT.cpp
string ipAddress = "80.60.117.24"; // IP Address of the server
int port = 54000;
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(port);
那么,我在做什么错?我如何转发端口错误?
答案 0 :(得分:0)
让我看看我是否了解这种情况。您要连接到服务器的客户端是否使用与服务器相同的Internet连接? 您将IP设置为允许通信正常工作的同一子网,使我认为这是这种情况。 如果是这种情况,则可能无法正常工作,因为流量会向外路由到您的路由器。路由器会查看它并说它在外部NAT上具有该流量。它将把流量路由到NAT,这将反过来应用您的端口转发规则。 挑战在于,当服务器响应时,它将响应NAT地址而不是LAN地址。当流量到达路由器时,端口转发将再次捕获流量并将其发送到服务器。这样客户端就可以进入服务器,但是服务器最终只能与自己对话。 我会尝试从其他位置进行连接(例如在不同的Internet连接中)。如果可行,那么您就知道发生了这种循环。 就像@RemyLebeau指出的那样,除非您拥有一定范围的公用IP,并且路由器的公用IP与服务器的公用IP不同,否则通常您的服务器上将没有公用IP。如果服务器确实有单独的公用IP,则请确保路由器的WAN端口和服务器在同一VLAN中。因此,您将必须将交换机上的流量引入没有VIP设置的隔离VLAN。但是,完全暴露服务器风险很大。 如果您将服务器设置为与路由器相同的IP,则问题将完全不同。 您将希望服务器的IP位于本地LAN上,并且PAT设置为将流量转发到该本地IP。因此,如果您的计算机具有192.168.8.50,则您的服务器可能具有192.168.8.40。静态的东西,不在DHCP范围内,并且在子网内(我假定为/ 24网络-255.255.255.0)。 希望这会有所帮助。 如果我错过了标记,或者您的设置与上述任何情况都不相同,请提供有关您的网络配置拓扑的更多详细信息。
答案 1 :(得分:0)
好吧,我知道了。我所做的只是将服务器托管在其他网络上(我家中有2个连接)。端口转发设置正确。谢谢你们的良好帮助,也对我的艰难描述深表歉意。 :)