Подключение двух UDP-клиентов к одному порту (отправка и получение)

я попробовал предложение от этот вопрос С очень маленьким успехом.

пожалуйста... любая помощь будет очень признательна!

вот мой код:

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 ответов


вы должны установить параметр сокета перед переплетом.

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

Я посмотрел ваше сообщение об ошибке, и это объясняет, что такое ошибка и почему это происходит.

вот точное сообщение об ошибке и причине WSAEACCES 10013 (MSDN)

отказано.

была сделана попытка доступа к сокету таким образом, запрещено право доступа. Пример использования широковещательного адреса для sendto без широковещательного разрешения, устанавливаемого с помощью setsockopt (SO_BROADCAST).

другой возможной причиной ошибки WSAEACCES является то, что при привязке функция вызывается (в Windows NT 4.0 с SP4 и более поздних версиях), другая драйвер режима приложения, службы или ядра привязан к одному и тому же адрес с эксклюзивным доступом. Такой эксклюзивный доступ-это новая функция Windows NT 4.0 с SP4 и более поздних версий, и реализуется с помощью Опция 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 ().. извиняюсь.


для решения задачи WSAEACCESS 10013 (MSDN) исключение в приложении UDP вы можете попробовать

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