public async Task StartAsync(CancellationToken ct) { using (var udpClient = new UdpClient(AddressFamily.InterNetworkV6)) { udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ExclusiveAddressUse, false); udpClient.Client.Bind(new IPEndPoint(IPAddress.IPv6Any, _localPort)); foreach (var nicIndex in CollectNetworkInterfaceIndexes()) { udpClient.JoinMulticastGroup(nicIndex, _mcastGroup); } while (true) { ct.ThrowIfCancellationRequested(); var result = await udpClient.ReceiveAsync() .WithCancellation(ct) .ConfigureAwait(false); if (_qualifiers.All(q => q.IsSourceQualified(result.RemoteEndPoint))) { var e = new MulticastMsgEventArgs( new IPEndPoint(_mcastGroup, _localPort), result.RemoteEndPoint, result.Buffer); OnMessageReceived(e); } } } }
private void MessageReceived(object sender, MulticastMsgEventArgs mMsg) { Log.Info($"Receved message from {mMsg.RemoteEndpoint.Address}:{mMsg.RemoteEndpoint.Port}. Message length is {mMsg.Data.Length}"); var message = new MulticastMessage(mMsg.Data, mMsg.MCastEndpoint); _mcastQueue.Post(message); }
protected void OnMessageReceived(MulticastMsgEventArgs e) { Volatile.Read(ref MessageReceived)?.Invoke(this, e); }