У меня есть служба, которая получает и отправляет некоторые обновления через широковещательную рассылку 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);
}
Есть ли что-то очевидное, что я здесь упускаю? Попытка гуглить, но это не сильно помогло.