【问题标题】:C# UDP cannot listen on a port that has already been used to send data?C# UDP 无法侦听已用于发送数据的端口?
【发布时间】:2011-12-21 03:44:21
【问题描述】:

我是 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.Argument”等于发送方的本地端口时,侦听器才侦听失败。当我将接收端口设置为不同的端口时,我能够接收数据包。

另外,我无法创建更多的 UdpClient 实例,因为每个 UdpClient 的本地端口都不同,因此我无法进行打孔。

我已经搜索了很多地方,似乎没有人有这个问题......

我相信有更简单的方法...

【问题讨论】:

    标签: c# udp port p2p hole-punching


    【解决方案1】:

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

    【讨论】:

    • 谢谢。一开始我不想尝试这个,因为我必须监听所有 IP 地址。
    【解决方案2】:

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

    然后我的监听器仍然能够监听所有传入的连接。

    【讨论】:

      猜你喜欢
      • 2016-04-29
      • 2017-09-23
      • 2013-10-13
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 2015-02-22
      相关资源
      最近更新 更多