2013-08-06 74 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);