【问题标题】:C++ Sockets with Router带路由器的 C++ 套接字
【发布时间】:2013-08-06 15:35:13
【问题描述】:

我正在使用套接字制作多人游戏,但服务器端出现了一些问题。服务器应在路由器后面的计算机上运行。因此,我对服务器 inet_addr 应该是什么感到有点困惑。我正在使用端口 1234 并将其转发到我的 PC(我保留服务器的地方)。

我尝试使用从 myipaddress.com 获得的自己的 IP 地址,以及我计算机的路由器地址 (192.168.0.101)。第一次尝试我得到了很多连接,最终导致程序终止,第二次尝试没有连接到它。

addr.sin_addr.s_addr= inet_addr("192.168.0.101");
addr.sin_port       = htons(1234);
addr.sin_family = AF_INET;

我应该怎么做才能使任何客户端都能够连接到服务器并且服务器从路由器后面运行?

【问题讨论】:

  • 这个问题似乎跑题了,因为它是关于防火墙配置的

标签: c++ sockets port


【解决方案1】:

通过路由器中的端口转发,路由器需要知道将指向所选端口范围的数据包发送到哪个设备。路由器正在询问您的内部 IP 地址,(网站只能看到您的外部 IP 地址)。

您可以通过在 cmd 中调用 ipconfig 在 Windows 上找到它(我相信该命令在 Linux 上可能是 ifconfig -a),这会列出您所有的网络接口和任何已连接的内部 IP 地址。您应该查找192.168.0.xxx 形式的值。

当有人想要连接到您的服务器时,如果您向他们提供您的外部 IP 地址和所需端口,他们的数据包将通过该端口发送到您的路由器,并通过内部 IP 地址将其转发到您的计算机。

如果您定期断开计算机与网络的连接,您可能需要配置内部 IP,使其保持静态并始终分配相同的地址。

【讨论】:

  • 或者使用uPNP在服务器应用运行时动态配置路由器端口转发规则。
  • 是的,但是 uPNP 可能很狡猾并且无法正常工作(在我的情况下似乎总是如此)并且它也存在安全风险。
【解决方案2】:

这与您的程序无关,而与您的网络配置有关。去了解 NAT(网络地址转换)并在路由器上进行端口转发或 DMZ。

通常您希望您的程序绑定到所有接口 - INADDR_ANY - 但重要的是您的路由器控制的网络上的地址(通常是 192.168.0.0/16,但它可以是任何 RFC1918 地址块)。

在路由器上配置好网络并从程序绑定外部接口后(不要像示例中那样硬编码地址,只需使用 INADDR_ANY)

serv_addr.sin_addr.s_addr = inet_addr(INADDR_ANY);

【讨论】:

    猜你喜欢
    • 2016-07-20
    • 2015-06-02
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 2011-12-21
    • 2022-10-07
    • 2017-05-19
    • 2021-03-05
    相关资源
    最近更新 更多