Пример #1
0
        public UdpSender(UdpExt udp, IActorRef commander, IEnumerable <Inet.SocketOption> options)
        {
            _udp       = udp;
            _commander = commander;
            _options   = options;

            _socket = new Func <Socket>(() =>
            {
                var socket = new Socket(SocketType.Dgram, ProtocolType.Udp)
                {
                    Blocking = false
                };
                _options.ForEach(x => x.BeforeDatagramBind(socket));
                return(socket);
            })();
        }
Пример #2
0
        /// <summary>
        /// TBD
        /// </summary>
        /// <param name="udp">TBD</param>
        /// <param name="channelRegistry">TBD</param>
        /// <param name="commander">TBD</param>
        /// <param name="options">TBD</param>
        public UdpSender(UdpExt udp, IChannelRegistry channelRegistry, IActorRef commander, IEnumerable <Inet.SocketOption> options)
        {
            _udp       = udp;
            _commander = commander;
            _options   = options;

            _channel = new Func <DatagramChannel>(() =>
            {
                var datagramChannel = DatagramChannel.Open();
                datagramChannel.ConfigureBlocking(false);
                var socket = datagramChannel.Socket;
                _options.ForEach(x => x.BeforeDatagramBind(socket));

                return(datagramChannel);
            })();

            channelRegistry.Register(_channel, SocketAsyncOperation.None, Self);
        }
Пример #3
0
        public UdpListener(UdpExt udp, IChannelRegistry channelRegistry, IActorRef bindCommander, Udp.Bind bind)
        {
            _udp             = udp;
            _channelRegistry = channelRegistry;
            _bindCommander   = bindCommander;
            _bind            = bind;

            _selector = Context.Parent;

            Context.Watch(bind.Handler);        // sign death pact

            _channel = (bind.Options.OfType <Inet.DatagramChannelCreator>()
                        .FirstOrDefault() ?? new Inet.DatagramChannelCreator()).Create();
            _channel.ConfigureBlocking(false);

            var localAddress = new Func <object>(() =>
            {
                try
                {
                    var socket = Channel.Socket;
                    bind.Options.ForEach(x => x.BeforeDatagramBind(socket));
                    socket.Bind(bind.LocalAddress);
                    var ret = socket.LocalEndPoint;
                    if (ret == null)
                    {
                        throw new ArgumentException(string.Format("bound to unknown SocketAddress [{0}]", socket.LocalEndPoint));
                    }
                    channelRegistry.Register(Channel, SocketAsyncOperation.Receive, Self);
                    _log.Debug("Successfully bound to [{0}]", ret);
                    bind.Options.OfType <Inet.SocketOptionV2>().ForEach(x => x.AfterBind(socket));
                    return(ret);
                }
                catch (Exception e)
                {
                    bindCommander.Tell(new Udp.CommandFailed(bind));
                    _log.Error(e, "Failed to bind UDP channel to endpoint [{0}]", bind.LocalAddress);
                    Context.Stop(Self);
                    return(null);
                }
            })();
        }
Пример #4
0
        public UdpListener(UdpExt udp, IActorRef bindCommander, Bind bind)
        {
            Udp            = udp;
            _bindCommander = bindCommander;
            _bind          = bind;

            _selector = Context.Parent;

            Context.Watch(bind.Handler);        // sign death pact

            Socket          = (bind.Options.OfType <Inet.DatagramChannelCreator>().FirstOrDefault() ?? new Inet.DatagramChannelCreator()).Create();
            Socket.Blocking = false;

            try
            {
                foreach (var option in bind.Options)
                {
                    option.BeforeDatagramBind(Socket);
                }

                Socket.Bind(bind.LocalAddress);
                var ret = Socket.LocalEndPoint;
                if (ret == null)
                {
                    throw new ArgumentException($"bound to unknown SocketAddress [{Socket.LocalEndPoint}]");
                }

                Log.Debug("Successfully bound to [{0}]", ret);
                bind.Options.OfType <Inet.SocketOptionV2>().ForEach(x => x.AfterBind(Socket));

                ReceiveAsync();
            }
            catch (Exception e)
            {
                bindCommander.Tell(new CommandFailed(bind));
                Log.Error(e, "Failed to bind UDP channel to endpoint [{0}]", bind.LocalAddress);
                Context.Stop(Self);
            }
        }
Пример #5
0
 /// <summary>
 /// TBD
 /// </summary>
 /// <param name="udp">TBD</param>
 public UdpManager(UdpExt udp)
 {
     _udp = udp;
 }
Пример #6
0
 public UdpManager(UdpExt udp)
     : base(udp.Setting, udp.Setting.NrOfSelectors)
 {
     _udp = udp;
 }