Salut à tous,
Je développe un petit programme de socket en mode RAW sous Linux que je pourrais résumer à ceci :
int i = 0;
for(i = 0; i < 100; i++)
{
sendto(/*blablabla*/);
}
Lorsque j'exécute mon programme, d'après wireshark et ifconfig, je n'envois que 22 à 23 paquets soit un rendement de... 22 à 23%, évidemment ces chiffres peuvent varier légèrement.
Pour être totalement efficace, je dois ajouter un usleep() qui laisse une petite pause pour laisser le temps d'envoyer proprement.
Or ce concept me dérange, que les paquets n'arrivent pas tous à destination, soit, c'est normal puisque les choses se font très rapidement. Mais que mes paquets ne soient pas tous envoyés me dérange, je préférerais que sendto bloque mais fasse son travail.
Que se passe-t-il concrètement ? Quelque chose sature ? La pile réseau, la socket, autre chose ?
La page de MAN dit que sendto ne garantie pas la bonne réception, or je devrais au moins pouvoir envoyer TOUS mes paquets même s'ils sont perdus et que le destinataire n'en reçoive que quelques-uns..
Pour résoudre ce problème, que faire ?
# Tester le code retour de sendto?
Posté par reno . Évalué à 3.
Il prévient quand son buffer est plein je crois.
Mais c'est vrai que ce n'est pas terrible comme comportement, comme si tu utilisais le flag MSG_DONTWAIT ou que tu avais mits ta socket en O_NONBLOCK..
[^] # Re: Tester le code retour de sendto?
Posté par Worms . Évalué à 0.
J'ai l'impression qu'il ne prévient pas puisque je n'ai aucune erreur de retour de sendto. À mon avis, le kernel drop en silence les paquets et je ne sais pas que faire pour éviter ça
[^] # Re: Tester le code retour de sendto?
Posté par paipai62 . Évalué à 1.
Un write()...
[^] # Re: Tester le code retour de sendto?
Posté par Worms . Évalué à 1.
Comment ça ? Je vois pas où tu veux en venir
[^] # Re: Tester le code retour de sendto?
Posté par paipai62 . Évalué à 1.
Il me semble que tu a une histoire de buffer avec send* et pas avec write.
[^] # Re: Tester le code retour de sendto?
Posté par Worms . Évalué à 1.
C'est bien possible mais write ne semble fonctionner que si ma socket est connectée, ce qui ne peut être le cas puisque j'utilise des sockets RAW, je ne peux donc pas utiliser la fonction connect().
[^] # Re: Tester le code retour de sendto?
Posté par paipai62 . Évalué à 1.
Tu a jeté un œil à:
[^] # Re: Tester le code retour de sendto?
Posté par Michaël (site web personnel) . Évalué à 1.
C'est pas plutôt
man 2 socket
hum? 7 c'est pour les formats de fichiers.[^] # Re: Tester le code retour de sendto?
Posté par Worms . Évalué à 2.
Autant pour moi j'ai lu trop vite. J'ai testé avec connect()/write() mais j'arrive exactement au même résultat. En fouillant sur le net, j'ai vu qu'il s'agissait d'un problème un peu connu : http://linux.die.net/man/8/fprobe-ulog (section bug).
[^] # Re: Tester le code retour de sendto?
Posté par Michaël (site web personnel) . Évalué à 1.
La page de man de
send
dit ceci:Si ça ne suffit pas, essaie de te trouver un petit tutoriel (éventuellement un chapitre de livre) consacré aux raw sockets, la programmation système en général et les IPC en particulier sont des domaines plutôt piégeux (disons que les pages de man servent de référence pas d'introduction).
Et puis avant de te lancer dans des investigations plus poussées tu peux aussi essayer de vérifier la configuration de Wireshark ou tenter uen fois de monitorer avec un autre programme.
[^] # Re: Tester le code retour de sendto?
Posté par Worms . Évalué à 1.
Je vais effectivement approfondir tout ça. Ceci dit je suis certain du fait que j'envoie en sous-nombre mes paquets. Je peux le vérifier à la fois avec ifconfig qui donne le nombre de paquets envoyé sur chaque interface ainsi qu'avec Wireshark (que j'utilise depuis un moment également) qui me donne à chaque fois exactement le même nombre.
[^] # Re: Tester le code retour de sendto?
Posté par Worms . Évalué à 6.
Je viens à l'instant de trouver avec un collègue en remontant les sources du noyau : il fallait changer une option à l'aide de setsockopt :
int on = 1;
setsockopt(mysock, SOL_IP, IP_RECVERR, &on, sizeof(on))
[^] # Re: Tester le code retour de sendto?
Posté par reno . Évalué à 1.
Beurk, les man pages sont-elles a jour?
Devoir lire les sources du kernel pour avoir les options des sockets, no comment..
[^] # Re: Tester le code retour de sendto?
Posté par paipai62 . Évalué à 1.
Tu peu développer l'utilité de cette option?
[^] # Re: Tester le code retour de sendto?
Posté par podoc . Évalué à 0.
http://lmgtfy.com/?q=setsockopt+IP_RECVERR
Premier résultat
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.