Tengo una aplicación SIP que necesita enviar paquetes UDP para configurar las llamadas SIP. SIP tiene un mecanismo de tiempo de espera para hacer frente a las fallas en la entrega. Otra cosa que me gustaría hacer es detectar si un socket UDP está cerrado para tener que esperar el intervalo de retransmisión de 32 segundos que usa SIP.Escuchar paquetes ICMP en C#
Los casos a los que me refiero son cuando un intento de enviar a un socket UDP da como resultado que el host remoto genere un paquete de ICMP Destination Uncachable. Si intento enviar un paquete UDP a un host que está activo pero que el puerto no está escuchando, puedo ver que el mensaje ICMP vuelve con un trazador de paquetes, pero la pregunta es ¿cómo puedo acceder a eso desde mi código C#?
Estoy jugando con sockets sin formato, pero aún no he podido recibir los paquetes ICMP para que los reciba mi programa. El ejemplo siguiente nunca recibe un paquete a pesar de que los mensajes ICMP llegan a mi PC.
Socket icmpListener = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
icmpListener.Bind(new IPEndPoint(IPAddress.Any, 0));
byte[] buffer = new byte[4096];
EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
int bytesRead = icmpListener.ReceiveFrom(buffer, ref remoteEndPoint);
logger.Debug("ICMPListener received " + bytesRead + " from " + remoteEndPoint.ToString());
A continuación se muestra una traza Wireshark muestra las respuestas ICMP que entran en mi PC de un intento de enviar un paquete UDP a 10.0.0.100 (mi PC) a 10.0.0.138 (mi router) en un puerto Sé que es no escuchando Mi problema es cómo hacer uso de esos paquetes ICMP para darse cuenta de que el envío UDP ha fallado en lugar de simplemente esperar a que la aplicación expire el tiempo después de un período arbitrario.
No sé si ayuda o no. Pero usando He estado usando Socket.BeginReceiveFrom y de vez en cuando fallará con SocketException de SocketError.ConnectionReset (10054). En el protocolo UDP, esta es una notificación de que el socket recibió un mensaje ICMP Port Unreachable. – SilverX
Esa misma excepción se lanza sin importar cómo se recibe desde el socket. El problema que siempre tuve fue que la excepción no te decía de qué host remoto provenía la respuesta ICMP. Eso es lo que el oyente de ICMP puede hacer. – sipwiz
¡Último +1 para seguir ofreciendo soluciones después de 3 años! –