我遇到了套接字問題。 我寫了兩個簡單的應用程序,一個服務器和一個客戶端。 服務器只需等待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轉發到服務器運行的計算機,順便說一句。
這是正常的。大多數NAT路由器僅對來自WAN的連接進行端口轉發,而不是LAN。如果有任何解決方法,它將取決於您的NAT路由器的型號,並且在這裏將成爲焦點話題。 – 2012-01-29 03:02:29