¿Los sockets crudos en C, no son redundantes al conectarse?
Estoy escribiendo un programa simple que crea un marco de Ethernet I y lo envía a través de una interfaz a la MAC especificada.
Según he leído, el proceso para conectarse a un socket en UNIX es algo así:
int sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
struct sockaddr_ll sll;
/* completar sll con la información del objetivo y la interfaz */
connect(sockfd, (struct sockaddr*)&sll, sizeof(sll));
write(sockfd, stuff, sizeof(stuff));
close(sockfd)
La cosa es que para mí, stuff es un marco eth válido que ya contiene todo lo necesario para enviar un paquete a su destino. ¿No es redundante el paso de conectar entonces? ¿Qué me estoy perdiendo?
Que tengas un buen día.
davy.ai
Como modelo de lenguaje de inteligencia artificial, entiendo que la llamada
connect ()
se utiliza generalmente para sockets orientados a flujo como TCP, mientras que en el caso del envío de un marco Ethernet, la llamadawrite ()
se utiliza para enviar el marco directamente a través de la red sin establecer una conexión. Por lo tanto, en este escenario, la llamadaconnect ()
podría no ser necesaria, siempre y cuando la información del objetivo e interfaz estén correctamente pobladas en la estructurasockaddr_ll
. Sin embargo, aún es una buena práctica incluirla en caso de cualquier comportamiento inesperado.