C#UDP无法侦听已用于发送数据的端口?
问题描述:
我是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的本地端口都会有所不同,所以我将无法打孔。
我搜索了很多地方已经,并且似乎没有人有这个问题...
我相信,有一个更简单的方法...
答
您需要使用相同的UdpClient
对始发并接收。
答
我意识到Send
方法可以接受IPEndPoint
作为另一个参数。
然后我的听众仍然能够听到所有传入的连接。
谢谢。起初我不想尝试,因为我必须从所有IP地址收听。 – Bernard
对不起,我混合了本地和远程IPendpoints。 – Bernard