rawsocket sendto () une partie du paquet est abandonnée et non visible sur le réseau

socketFd_ = socket(AF_INET, SOCK_RAW, protoType); sentBytes = sendto(socketFd_, buf, len, 0, (struct sockaddr *)&sa,sizeof(structsockaddr_in)); protoType = GRE 

J’envoie les 1000 paquets du réseau. Si mon débit de paquets TX est de 40, je peux voir tous les paquets dans Wireshark. Cependant, lorsque j’essayerai d’envoyer au taux de 100 une partie du paquet (3-4) ne parviendra pas dans le réseau, mais sendto ne retournera aucune erreur. Je sais que sendto mettra simplement le paquet txpacket dans la queue et ne garantira pas la livraison des paquets sur le réseau, mais d’où je peux obtenir les statistiques sur les paquets perdus et la raison de la chute des paquets dans le kernel. J’ai essayé d’augmenter le txqueuelen d’interface à 65000 mais cela n’a pas aidé. Comment puis-je déboguer ce problème?

Vous avez raison, sendto mettra simplement le paquet txpacket dans la queue et ne garantira pas la livraison.

De la documentation iEEE sur sendto:

La réussite de l’appel à sendto () ne garantit pas la livraison du message. Une valeur de retour de -1 indique uniquement les erreurs détectées localement.

Vous devez exécuter certaines de vos propres limitations via ioctl () et getsockopt () comme vous le faites presque. Je ne pense pas que vous puissiez vous attendre à ce que la stack réseau fasse tout pour vous.

Quelque chose comme:

 sendMsgThrottled( msg Msg ) { ioctl(socketFd_, SIOCOUTQ, &outstandingBytes); if ( outStandingBytes < limit ) sendto(socketFd_, ..) else queueMsg(); /* Or delay */ } 

Je voudrais tester cela avec en ayant l'envoi et le récepteur sur la même machine, la perte de paquets peut provenir d'autres endroits que la couche réseau du système d'exploitation.