Example #1
0
        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);
        }
Example #3
0
 protected void OnMessageReceived(MulticastMsgEventArgs e)
 {
     Volatile.Read(ref MessageReceived)?.Invoke(this, e);
 }