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

时间:2012-02-02 21:11:47

标签: c# port reusability udpclient

我尝试了this question的建议但收效甚微。

请...任何帮助将不胜感激!

这是我的代码:

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
}

4 个答案:

答案 0 :(得分:24)

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

    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();
    }

答案 1 :(得分:2)

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

以下是确切的错误消息和原因 WSAEACCES 10013(MSDN

  

许可被拒绝。

     

尝试以其禁止的方式访问套接字   访问权限。一个例子是使用sendto的广播地址   没有使用setsockopt(SO_BROADCAST)设置广播权限。

     

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

答案 2 :(得分:0)

即使更改代码以便我可以传入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()方法上产生异常..抱歉。

答案 3 :(得分:0)

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

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