首页 文章

C#UDP无法侦听已用于发送数据的端口?

提问于
浏览
2

我是UDP /网络编程的新手,我正在尝试通过UDP创建聊天板 .

我的最终目标是进行UDP打孔(与Skype类似的概念),因此我需要在与用于发送数据的端口相同的端口上侦听,否则NAT将丢弃传入的数据包 .

我试过了

server.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

但是我无法从用于发送数据的端口接收数据 .

这就是我的侦听器代码(它在一个单独的线程上)(它改编自Web上的另一个教程):

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 回答

  • 0

    您需要使用相同的 UdpClient 进行发送和接收 .

  • 2

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

    然后我的听众仍然可以收听所有传入的连接 .

相关问题