una puertos protocolo escaneo escanear comandos caracteristicas abiertos c sockets udp port connect

c - puertos - nmap udp



¿Cómo puedo saber si envío un paquete UDP a un puerto abierto? (2)

Como UDP no tiene conexión, debe verificar el estado del puerto en el código de la aplicación. Por ejemplo, envíe un paquete al puerto y espere una respuesta. Si no obtiene una respuesta en algún momento específico de la aplicación, el puerto no está disponible.

Tienes que diseñar esto tanto para el envío como para el que recibe, por supuesto.

Estoy haciendo un programa C en el que necesito verificar los puertos UDP abiertos en la computadora de destino. Como UDP no tiene conexión, no puedo verificar el valor de retorno de connect() como puedo con TCP.

send() valores de retorno send() y sendto() tampoco son de ayuda. La página del manual dice:

No indication of failure to deliver is implicit in a send(). Locally detected errors are indicated by a return value of -1.

¿Cómo puedo saber si envié un paquete UDP a un puerto abierto en el host de destino?


En general, no puedes hacerlo.

En principio, un host con un puerto cerrado debería devolver un puerto ICMP inalcanzable. Pero a menudo no lo hacen; Del mismo modo, un host inactivo o inactivo no enviará dicho mensaje. Además, algunos firewalls bloquearán el mensaje.

Recuperar el error también es problemático. Linux tiene una semántica bien definida pero confusa para recuperar errores en los sockets (ver las distintas páginas man, socket (7), ip (7) y udp (7) para obtener información). A veces verá un error anterior reportado cuando hace un sendto () no relacionado, por ejemplo. Otros sistemas operativos tienen mecanismos ligeramente diferentes para recuperar errores de socket específicos.

Si se garantiza que es un protocolo particular en el otro puerto, puede enviar un paquete que debe provocar una respuesta particular (si es su propio protocolo, puede agregar un tipo de mensaje "¿está ahí?"), Entonces puede usar ese. Pero, en general, si se genera una respuesta depende de la aplicación, y no se puede distinguir entre un puerto sin nada que escuchar y un puerto con algo que escucha y que decide no responder.