J'ai le code suivant pour ouvrir une socket raw et l'envoyer. Dans la fonction d'envoi que j'ai une instruction trace me montrant que la longueur de mon paquet est 21. Cependant, quand je considère les paquets sur la réception en utilisant un renifleur de paquets, je vois:802.3 longueur de l'en-tête toujours 256 lors de l'utilisation des sockets raw dans Linux
- La longueur réelle du paquet est 60.
- la longueur (comme indiqué dans l'en-tête 802.3) est 256.
Aucun de ces chiffres est 21, et je suis en communication avec un dispositif intégré qui n'aime pas la différence. J'ai parcouru Google mais je n'arrive pas à comprendre comment envoyer sendto() la bonne longueur.
bool EthernetSocket::_open(const char *ifname) {
_sd = socket(AF_PACKET, SOCK_DGRAM, htons(ETH_P_802_2));
_ifname = ifname;
_ifidx = Ethernet::GetInterface(ifname);
if(_sd < 0) {
perror("Failed to open socket");
_bOpened = false;
}
else {
_bOpened = true;
}
return _bOpened;
}
bool EthernetSocket::_send(const Buffer& txbuff, Address& addr) {
if(txbuff.Length() == 0)
return false;
if(_ifidx != -1)
addr.SetInterface(_ifidx);
printf("SEND: Length: %d\n", txbuff.Length());
if(sendto(_sd, txbuff.Data(), txbuff.Length(), 0, (struct sockaddr *) addr.Component(), (socklen_t) addr.Size()) == -1) {
perror("Failed broadcast");
return false;
}
return true;
}
Edit: J'ai découvert que ce champ est réglé sur le champ sll_protocol dans ma structure sockaddr_ll. Mais pourquoi? Le réglage à htons (ETH_P_802_2), comme il se doit, n'aide pas.