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将是不同的,所以我将无法做打孔。

我已经找了很多地方,似乎没有人有这个问题…

c# UDP不能监听已经用来发送数据的端口

您需要使用相同的UdpClient来发送和接收。

我意识到Send方法可以接受IPEndPoint作为另一个参数。

那么我的监听器将仍然能够监听所有传入的连接