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); }