J'écris du code pour envoyer des trames Ethernet brutes entre deux boîtes Linux. Pour tester cela, je veux juste obtenir un simple client-envoyer et serveur-recevoir.linux raw socket ethernet se lier à un protocole spécifique
J'ai le client faisant correctement des paquets (je peux les voir en utilisant un renifleur de paquet).
Du côté du serveur, j'initialiser la prise comme ceci:
fd = socket(PF_PACKET, SOCK_RAW, htons(MY_ETH_PROTOCOL));
où MY_ETH_PROTOCOL
est une constante que j'utilise 2 octets comme ethertype donc je n'entends pas le trafic réseau étranger.
quand je lie cette prise à mon interface je dois le transmettre à nouveau un protocole dans le struct socket_addr: socket_address.sll_protocol = htons(MY_ETH_PROTOCOL);
Si je compiler et exécuter le code comme celui-ci alors il échoue. Mon serveur ne voit pas le paquet. Cependant si je change le code comme ceci:
socket_address.sll_protocol = htons(ETH_P_ALL);
Le serveur peut alors voir le paquet envoyé du client (aussi bien que beaucoup d'autres paquets) ainsi je dois faire une certaine vérification du paquet pour voir qu'il correspond à MY_ETH_PROTOCOL
.
Mais je ne veux pas que mon serveur entende du trafic qui n'est pas envoyé sur le protocole spécifié, donc ce n'est pas une solution. Comment puis-je faire cela?
Pouvez-vous coller le code dans lequel vous avez configuré 'socket_address'? – bstpierre