Esempio n. 1
0
        public bool SendHandlers(object message)
        {
            switch (message)
            {
            case Send send when HasWritePending:
            {
                if (Udp.Setting.TraceLogging)
                {
                    _log.Debug("Dropping write because queue is full");
                }
                Sender.Tell(new CommandFailed(send));
                return(true);
            }

            case Send send:
            {
                if (send.HasData)
                {
                    _pendingSend      = send;
                    _pendingCommander = Sender;

                    //var e = Udp.SocketEventArgsPool.Acquire(Self);
                    if (send.Target is DnsEndPoint dns)
                    {
                        var resolved = Dns.ResolveName(dns.Host, Context.System, Self);
                        if (resolved != null)
                        {
                            try
                            {
                                _pendingSend = new Send(_pendingSend.Payload, new IPEndPoint(resolved.Addr, dns.Port), _pendingSend.Ack);
                                DoSend();
                            }
                            catch (Exception ex)
                            {
                                Sender.Tell(new CommandFailed(send));
                                _log.Debug("Failure while sending UDP datagram to remote address [{0}]: {1}",
                                           send.Target, ex);
                                _retriedSend      = false;
                                _pendingSend      = null;
                                _pendingCommander = null;
                            }
                        }
                    }
                    else
                    {
                        DoSend();
                    }
                }
                else
                {
                    if (send.WantsAck)
                    {
                        Sender.Tell(send.Ack);
                    }
                }

                return(true);
            }

            case SocketSent sent:
            {
                if (sent.EventArgs.SocketError == SocketError.Success)
                {
                    if (Udp.Setting.TraceLogging)
                    {
                        _log.Debug("Wrote [{0}] bytes to channel", sent.EventArgs.BytesTransferred);
                    }

                    if (_pendingSend.WantsAck)
                    {
                        _pendingCommander.Tell(_pendingSend.Ack);
                    }

                    _retriedSend      = false;
                    _pendingSend      = null;
                    _pendingCommander = null;
                }
                else if (_retriedSend)
                {
                    _pendingCommander.Tell(new CommandFailed(_pendingSend));

                    _retriedSend      = false;
                    _pendingSend      = null;
                    _pendingCommander = null;
                }
                else
                {
                    DoSend();
                    _retriedSend = true;
                }
                return(true);
            }

            default: return(false);
            }
        }