2011-11-03 85 views
2

我是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的本地端口都會有所不同,所以我將無法打孔。

我搜索了很多地方已經,並且似乎沒有人有這個問題...

我相信,有一個更簡單的方法...

回答

2

您需要使用相同的UdpClient對始發並接收。

+0

謝謝。起初我不想嘗試,因爲我必須從所有IP地址收聽。 – Bernard

+0

對不起,我混合了本地和遠程IPendpoints。 – Bernard

0

我意識到Send方法可以接受IPEndPoint作爲另一個參數。

然後我的聽衆仍然能夠聽到所有傳入的連接。