c# UDP不能监听已经用来发送数据的端口
本文关键字:数据 不能 UDP 监听 | 更新日期: 2023-09-27 18:13:07
我是新来的UDP/网络编程,我正试图通过UDP创建一个聊天板。
我的最终目标是做UDP打孔(类似于Skype的概念),所以我需要在用于发送数据的端口上侦听相同的端口,否则NAT将丢弃传入的数据包。
我已经试过了
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"时才侦听失败。参数"等于发送方的本地端口。当我将接收端口设置为不同的端口时,我可以接收数据包。
另外,我不能创建更多的UdpClient实例,因为我的本地端口对于每个UdpClient将是不同的,所以我将无法做打孔。
我已经找了很多地方,似乎没有人有这个问题…
您需要使用相同的UdpClient
来发送和接收。
我意识到Send
方法可以接受IPEndPoint
作为另一个参数。
那么我的监听器将仍然能够监听所有传入的连接