2011-11-03 84 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作为另一个参数。

然后我的听众仍然能够听到所有传入的连接。