Estoy escribiendo código para enviar tramas Ethernet sin procesar entre dos cajas de Linux. Para probar esto, solo quiero obtener un simple cliente-enviar y servidor-recibir.zócalo de Ethernet sin conexión de Linux se une al protocolo específico
Tengo el cliente haciendo paquetes correctamente (puedo verlos usando un sniffer de paquetes).
En el lado del servidor que inicializar el zócalo de este modo:
fd = socket(PF_PACKET, SOCK_RAW, htons(MY_ETH_PROTOCOL));
donde MY_ETH_PROTOCOL
2 es una constante byte utilizo como un ethertype por lo que no se oye el tráfico de red ajena.
cuando me ato esta toma a mi interfaz que debe pasar es un protocolo de nuevo en la estructura socket_addr: socket_address.sll_protocol = htons(MY_ETH_PROTOCOL);
Si puedo compilar y ejecutar el código como esto, entonces se produce un error. Mi servidor no ve el paquete. Sin embargo, si cambio el código de la siguiente manera:
socket_address.sll_protocol = htons(ETH_P_ALL);
El servidor puede ver el paquete enviado desde el cliente (así como muchos otros paquetes), así que tengo que verificar el paquete para ver si coincide con MY_ETH_PROTOCOL
.
Pero no quiero que mi servidor escuche el tráfico que no se envía en el protocolo especificado, así que no es una solución. ¿Cómo hago esto?
¿Se puede pegar el código donde se configuró su 'socket_address'? – bstpierre