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