System.Net.Socket.BeginReceive () вызывает исключение, говорящее E_FAIL - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть служба, которая получает и отправляет некоторые обновления через широковещательную рассылку ipv4. Изменение, которое я пытаюсь сделать, должно быть в состоянии использовать многоадресную рассылку ipv6, чтобы сделать то же самое.

Вот как я это делаю -

На стороне получателя есть 2 объекта UdpClient. Тот, который слушает IPAddress.Any, и определенный порт;другой прослушивает IPAddress.Ipv6AddrAny и на том же порту, затем присоединяется к групповым локальным узлам всех групп многоадресной рассылки - то есть адресу FF02 :: 1.

Я подтвердил, что с привязкой к сокету проблем нет, но возникает исключение при попытке получить данные. Я пытаюсь сделать асинхронный прием для обоих клиентов, и я обнаружил, что BeginReceive () вызывает исключение с HResult -2147467259 (E_FAIL). Есть ли что-то очевидное, что я делаю не так?

Код привязки сокета -

this.groupEndPoint = new IPEndPoint(IPAddress.Any, port);
this.multicastGroupEndPoint = new IPEndPoint(IPAddress.IPv6Any, port);

SimpleUdpClient udpClient = new SimpleUdpClient();
udpClient.ExclusiveAddressUse = false;
udpClient.EnableBroadcast = true;

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

udpClient.Client.Bind(this.groupEndPoint);
this.udpClient = udpClient;

IPAddress ipv6LinkLocalMulticastGroup = IPAddress.Parse("FF02::1");

SimpleUdpClient udpMulticastClient = new 
SimpleUdpClient(AddressFamily.InterNetworkV6);
udpMulticastClient.ExclusiveAddressUse = false;
udpMulticastClient.Client.SetSocketOption(SocketOptionLevel.Socket, 
                                          SocketOptionName.ReuseAddress,
                                          true);
udpMulticastClient.JoinMulticastGroup(ipv6LinkLocalMulticastGroup);
udpMulticastClient.Client.Bind(this.multicastGroupEndPoint);
this.udpMulticastClient = udpMulticastClient;

Код получения данных -


try
{
    byte[] data = null;
    IAsyncResult broadcastResult = this.udpClient.BeginReceive(null, null);
    IAsyncResult multicastResult = this.udpMulticastClient.BeginReceive(null, null);

    WaitHandle[] waitHandles = { this.shutdownRequestedEvent,
                                 broadcastResult.AsyncWaitHandle,
                                 multicastResult.AsyncWaitHandle };

    int handleIndex = WaitHandle.WaitAny(waitHandles);

    if (handleIndex == 0)
    {
        return false;
    }

    if (handleIndex == 1)
    {
        byte[] broadcastData = this.udpClient.EndReceive(broadcastResult, 
                                                         ref this.groupEndPoint);

        data = broadcastData;
    }
    else if (handleIndex == 2)
    {
        byte[] multicastData = this.udpMulticastClient.EndReceive(multicastResult, 
                                   ref this.multicastGroupEndPoint);

        data = multicastData;
    }
.
.
.

catch (SocketException socketException)
{
    this.watson.SendReport(socketException);
}

Есть ли что-то очевидное, что я здесь упускаю? Попытка гуглить, но это не сильно помогло.

...