¿Es posible escuchar en un puerto específico usando sockets sin formato?

Sí, pero con un socket sin procesar no estás escuchando un puerto , estás escuchando un protocolo IP. TCP, por ejemplo, es en realidad el protocolo IP 6. Dentro del protocolo 6 hay una definición de un mecanismo para multiplexar / demultiplexar conexiones en forma de puertos. Hay muchos otros protocolos (si usa un sistema similar a UNIX, consulte / etc / protocolos o vea la lista oficial de Números de protocolo de la IANA). Otros ejemplos comunes de protocolos IP pueden incluir UDP (… también tiene puertos), ICMP (tipos de mensajes) y GRE (discriminadores de túnel).

Si está implementando un socket sin procesar (consulte raw (7) – página de manual de Linux para comenzar) deberá seleccionar un nuevo número de protocolo. En ese momento, cualquier paquete que llegue a la caja con ese tipo de protocolo IP será dirigido a usted. Si decide implementar una noción de puertos y cómo permite que esos puertos se vinculen / escuchen, depende completamente de usted, al igual que cualquier tipo de mecanismo para verificación de datos, retransmisión, secuenciación, control de flujo, dimensionamiento de mensajes, negociación de sesión, etc., etc. Si algo de esto parece excesivo, es posible que desee apegarse a bind () y / o listen ().

Sí y no, pero principalmente no.

Un “puerto” es algo que existe en algunos protocolos de la capa de transporte. Por ejemplo, el protocolo TCP tiene “puertos”, y el protocolo UDP tiene un espacio separado de “puertos”, y los protocolos ICMP echo y ICMP tienen “identificadores” que son como puertos similares.

Por lo tanto, un socket TCP (un dominio de Internet, socket de flujo) y un socket UDP (un dominio de Internet, socket de datagrama) pueden escuchar en un puerto en particular, ya que un “puerto” es algo que existe en TCP y UDP.

Pero un socket “en bruto” significa uno que recibe tramas Ethernet completas, o datagramas IP. No hay puerto en esos protocolos. El puerto solo existe en algunos protocolos que viven dentro de algunos datagramas IP.

Podría imaginar una entrada de firewall o iptables que examine todas las tramas Ethernet entrantes o datagramas IP, verifique si contienen un encabezado UDP o TCP, verifica el número de puerto en ese encabezado y luego pasa el datagrama de trama / IP solo si el puerto El número coincide con algún patrón. Pero realmente no llamaríamos a esto un socket en bruto que está “escuchando” solo en un puerto UDP o TCP particular.