1

我正在使用套接字制作多人游戏,但服务器端存在一些问题。服务器应从路由器后面的计算机运行。因此,我有点坚持服务器应该是什么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;

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

4

2 回答 2

3

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

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

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

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

于 2013-08-06T19:09:12.530 回答
0

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

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

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

serv_addr.sin_addr.s_addr = inet_addr(INADDR_ANY);
于 2013-08-06T16:04:13.470 回答