Beispiel #1
0
        public bool SendHandlers(object message)
        {
            var send = message as Send;

            if (send != null && HasWritePending)
            {
                if (Udp.Setting.TraceLogging)
                {
                    _log.Debug("Dropping write because queue is full");
                }
                Sender.Tell(new CommandFailed(send));
                return(true);
            }
            if (send != null)
            {
                if (send.HasData)
                {
                    _pendingSend      = send;
                    _pendingCommander = Sender;

                    var e   = Udp.SocketEventArgsPool.Acquire(Self);
                    var dns = send.Target as DnsEndPoint;
                    if (dns != null)
                    {
                        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(e);
                            }
                            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(e);
                    }
                }
                else
                {
                    if (send.WantsAck)
                    {
                        Sender.Tell(send.Ack);
                    }
                }

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

                    var nextSend = _pendingSend.Advance();
                    if (nextSend.HasData)
                    {
                        Self.Tell(nextSend);
                    }
                    else
                    {
                        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(sent.EventArgs);
                        _retriedSend = true;
                    }
                }
                return(true);
            }
            return(false);
        }