将两个UDP客户端连接到一个端口(发送和接收)

本文关键字:一个 两个 UDP 客户端 连接 | 更新日期: 2023-09-27 18:22:31

我尝试了这个问题的建议,但收效甚微。

请。。。任何帮助都将不胜感激!

这是我的代码:

static void Main(string[] args)
{
    IPEndPoint localpt = new IPEndPoint(IPAddress.Any, 6000);
    UdpClient udpServer = new UdpClient(localpt); 
    udpServer.Client.SetSocketOption(
        SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
    UdpClient udpServer2 = new UdpClient();
    udpServer2.Client.SetSocketOption(
        SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
    udpServer2.Client.Bind(localpt); // <<---------- Exception here
}

将两个UDP客户端连接到一个端口(发送和接收)

您必须在绑定之前设置套接字选项。

    static void Main(string[] args)
    {
        IPEndPoint localpt = new IPEndPoint(IPAddress.Any, 6000);
        UdpClient udpServer = new UdpClient();
        udpServer.Client.SetSocketOption(
            SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        udpServer.Client.Bind(localpt);
        UdpClient udpServer2 = new UdpClient();
        udpServer2.Client.SetSocketOption(
            SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        udpServer2.Client.Bind(localpt); // <<---------- No Exception here
        Console.WriteLine("Finished.");
        Console.ReadLine();
    }

或者一个更具说明性的例子:

    static void Main(string[] args)
    {
        IPEndPoint localpt = new IPEndPoint(IPAddress.Loopback, 6000);
        ThreadPool.QueueUserWorkItem(delegate
        {
            UdpClient udpServer = new UdpClient();
            udpServer.ExclusiveAddressUse = false;
            udpServer.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            udpServer.Client.Bind(localpt);
            IPEndPoint inEndPoint = new IPEndPoint(IPAddress.Any, 0);
            Console.WriteLine("Listening on " + localpt + ".");
            byte[] buffer = udpServer.Receive(ref inEndPoint);
            Console.WriteLine("Receive from " + inEndPoint + " " + Encoding.ASCII.GetString(buffer) + ".");
        });
        Thread.Sleep(1000);
        UdpClient udpServer2 = new UdpClient();
        udpServer2.ExclusiveAddressUse = false;
        udpServer2.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        udpServer2.Client.Bind(localpt);
        udpServer2.Send(new byte[] { 0x41 }, 1, localpt);
        Console.Read();
    }

我查看了您的错误消息,它解释了错误是什么以及发生错误的原因。

以下是确切的错误消息和原因WSAEACCES10013(MSDN)

权限被拒绝。

试图以其禁止的方式访问套接字访问权限。一个例子是使用sendto的广播地址而不使用setsockopt(SO_broadcast)设置广播许可。

WSAEACCES错误的另一个可能原因是当绑定函数被调用(在带有SP4及更高版本的Windows NT 4.0上),另一个应用程序、服务或内核模式驱动程序绑定到具有独占访问权限的地址。这种独占访问是一项新功能使用SP4及更高版本的Windows NT 4.0,并通过使用SO_EXCLUSIVEADDRUSE选项。

即使更改代码以便我可以传入IP地址,我也会收到相同的错误消息,显示您无法绑定到同一端口,只能使用一个端口这是我使用您的示例的示例代码,并对其进行了修改,以从本地机器捕获我的ip。。

        IPAddress ipAddress = Dns.Resolve(Dns.GetHostName()).AddressList[0];
        IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, 11000);
        //IPEndPoint localpt = new IPEndPoint(ipLocalEndPoint);
        UdpClient udpServer = new UdpClient(ipLocalEndPoint);
        udpServer.Client.SetSocketOption(
            SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        udpServer.Connect(ipLocalEndPoint);
        UdpClient udpServer2 = new UdpClient();
        udpServer2.Client.SetSocketOption(
            SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        udpServer2.Client.Bind(ipLocalEndPoint); // <<---------- Exception here

这将在Bind()方法上产生异常。。很抱歉

要解决UDP应用程序中的WSAEACCESS 10013(MSDN)异常,可以尝试

udpServer.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);