我是UDP /網絡編程的新手,我試圖通過UDP創建一個聊天板。我最終的目標是做UDP打孔(與Skype類似的概念),因此我需要在與用於發送數據的端口相同的端口上偵聽,否則NAT將丟棄傳入的數據包。C#UDP無法偵聽已用於發送數據的端口?
我曾嘗試做
server.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
但我無法從已被用來發送數據的端口接收數據。
這是我的聽衆代碼如下所示(它是一個單獨的線程)(改編自另一個教程在網絡上):
byte[] data = new byte[1024];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, (int)e.Argument);
UdpClient newsock = new UdpClient();
newsock.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
newsock.Client.Bind(ipep);
IPEndPoint from_ip = new IPEndPoint(IPAddress.Any, 0);
Invoke(new Action(() => { WriteOnScreen("Done!"); }));
while (true)
{
data = newsock.Receive(ref from_ip);
string s = Encoding.ASCII.GetString(data, 0, data.Length);
//more stuff to deal with s
}
這是我的發件人:
UdpClient server = new UdpClient();
server.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
server.Connect(CurrIP, CurrPort);
只有當應用程序被用戶終止時纔會調用server.Close()方法。
當我檢查發件人的本地端口時,我意識到只有當接收者的本地端口「(int)e.Argument」等於發件人的本地端口時,監聽程序纔會失敗。當我將接收端口設置爲不同的端口時,我能夠接收數據包。
此外,我無法創建更多的UdpClient實例,因爲每個UdpClient的本地端口都會有所不同,所以我將無法打孔。
我搜索了很多地方已經,並且似乎沒有人有這個問題...
我相信,有一個更簡單的方法...
謝謝。起初我不想嘗試,因爲我必須從所有IP地址收聽。 – Bernard
對不起,我混合了本地和遠程IPendpoints。 – Bernard