端口转发错误:端口转发未转发到服务器

Port forwarding error: Port forwarding is not forwarding to server

本文关键字:转发 服务器 错误      更新时间:2023-10-16

所以,我用c ++做了一个客户端和一个服务器。我的服务器将端口设置为 htons(54000)。我的客户端也有端口 htons(54000)。

我的问题是,当我尝试将我的客户端连接到我的机器(我的服务器托管在哪里,机器 ip 是:例如 80.60.117.24)时,什么也没发生!

我发现我需要使用端口转发。我的路由器是华为B525 - 23。我尝试从 WAN 端口 54000 转发到 LAN 端口 54000 和计算机的本地 IP:192.168.8.50。

好吧,它不起作用。

尽管它可以在服务器和客户端位于同一 LAN 上的情况下工作。(我将服务器在客户端上的IP地址设置为192.168.8.50(我的机器,服务器托管在这里))。

服务器

.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);

//客户端

.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);

那么,我做错了什么?我怎么转发端口错误?

嗯,我想通了。我所做的只是将服务器托管在不同的网络上(我家里有 2 个连接)。端口转发设置正确。谢谢你们的帮助,也很抱歉我的艰难描述。:)

让我看看我是否理解这个场景。您连接到服务器的客户端是否使用与服务器相同的互联网连接? 您将 IP 设置为允许流量工作的同一子网让我认为这就是这种情况。 如果是这种情况,那么它可能不起作用,因为流量会向外路由到您的路由器。路由器会查看它并说它在外部 NAT 上有该流量。它会将流量路由到 NAT,而 NAT 又会应用您的端口转发规则。 挑战在于,当服务器响应时,它将响应NAT地址而不是LAN地址。当该流量到达路由器时,端口转发将再次抓取流量并将其发送到服务器。这样客户端就可以到达服务器,但服务器最终只会与自己通信。 我会尝试从不同的位置连接(如在不同的互联网连接中)。如果这有效,那么你就知道你正在发生这个循环。 话虽如此,正如@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)。 希望这是有帮助的。 如果我错过了标记或您的设置与任何这些场景不同,请提供有关网络配置拓扑的更多详细信息。