2013-08-06 45 views
0

我正在使用套接字制作多人游戏,并且在服务器端有一些问题。服务器应从位于路由器后面的计算机运行。所以我有点卡住了服务器inet_addr应该是什么。我正在使用端口1234,并将其转发到我的PC(我保存服务器的地方)。带路由器的C++套接字

Port forwarding

我一直在使用这是我从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; 

我应该为了让任何客户端能够连接到服务器,并从路由器后面运行的服务器吗?

+0

此问题似乎是无关紧要的,因为它涉及防火墙配置 – RiaD

回答

3

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

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

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

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

+0

或者在服务器应用程序运行时使用uPNP动态配置路由器端口转发规则。 –

+0

诚然,uPNP可能会狡猾,无法正常工作(对我而言似乎总是如此),同时也带来了安全风险。 – Robadob

0

这与您的程序无关,并且与您的网络配置有关。去了解NAT(网络地址转换),并在您的路由器上进行端口转发或DMZ。通常你希望你的程序绑定到所有接口--INADDR_ANY--但重要的是你的路由器控制的网络地址(通常是192.168.0.0/16,但它可以是任何RFC1918地址块)。

一旦你有你的路由器,并从你的程序绑定在外部接口上配置了您的网络(没有硬编码地址就像你的榜样,只是使用INADDR_ANY)

serv_addr.sin_addr.s_addr = inet_addr(INADDR_ANY);