2012-01-29 67 views
0

我遇到了套接字問題。 我寫了兩個簡單的應用程序,一個服務器和一個客戶端。 服務器只需等待UDP數據包到達,然後在控制檯中輸出一些內容。 客戶端發送UDP數據包到特定的終點。使用公共IP連接到自己的PC

// server 
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
sock.Bind(new IPEndPoint(IPAddress.Any, 1337)); 
IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0); 
byte[] buf = new byte[1024]; 
sock.ReceiveFrom(buf, ref remote); 
Console.WriteLine("Received packet."); 

// client 
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
IPEndPoint remote = new IPEndPoint(IPAddress.Parse(Console.ReadLine()), UInt16.Parse(Console.ReadLine())); 
byte[] buf = { 1, 2, 3, 4 }; // random data 
sock.SendTo(buf, remote); 

現在奇怪的是,當客戶端套接字發送其數據包我的路由器的公網IP地址,服務器套接字只接收它,如果客戶沒有在同一臺PC服務器上運行。因此,如果我在PC上啓動服務器,然後在我的PC上啓動客戶端,請輸入我的公共IP和端口1337,服務器不會收到任何內容。 但是,如果我將客戶端應用程序發送給我的朋友,並給他我的IP地址和端口,那麼它的工作原理就很好。 如果我讓客戶端連接到本地IP而不是我的公共IP地址,它也可以工作。

我是唯一一個遇到這種行爲的人嗎? 端口1337轉發到服務器運行的計算機,順便說一句。

+1

這是正常的。大多數NAT路由器僅對來自WAN的連接進行端口轉發,而不是LAN。如果有任何解決方法,它將取決於您的NAT路由器的型號,並且在這裏將成爲焦點話題。 – 2012-01-29 03:02:29

回答

0

大多數路由器和調制解調器通常不會轉發UDP流量 - 有關說明,請參閱http://www.gotroot.com/blogpost4-Why-your-should-never-forward-UDP-out-of-your-firewall。也可以嘗試將客戶端和服務器連接到同一物理網絡(以及子網),並嘗試將數據報直接發送到服務器而不是轉發它們。

+0

感謝您的回答。只是好奇,你的鏈接描述了UDP打孔,不是嗎? – haiyyu 2012-01-29 03:23:00

+0

OP說他能夠通過他的路由器從公共互聯網接收UDP數據包到他內部連接到局域網的個人電腦。所以你的回答是路由器通常不會轉發UDP流量,在這種情況下是錯誤的! – 2012-01-29 03:32:04

+0

@ user1046192:是的,它的確如此。這也是許多應用(包括Skype,IIRC)使用的技術,允許通過NAT和防火牆進行直接的端到端通信。 – Jashank 2012-01-29 03:43:54

1

這似乎是一個NAT配置問題。您必須在路由器上配置nat,才能將通過特定端口(1337)進入公共接口的數據包轉發到服務器。所以當你的朋友給你發送一個UDP數據包的時候,這是有效的

但是你不能(不知道它是否可能)已經配置natting的意思是相同的UDP數據包進入內部接口。當您在同一臺計算機上將數據包從服務器發送到客戶端時,就是這種情況。

當服務器和客戶機(一臺機器上或兩臺不同的機器)是你的內部網絡上這將是最好使用服務器的接口ID不是取決於natting