Forum Programmation.c sendto ne fait pas complètement son boulot

Posté par  .
Étiquettes : aucune
3
21
sept.
2011

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  . É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  . É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  . Évalué à 1.

        Un write()...

      • [^] # Re: Tester le code retour de sendto?

        Posté par  (site web personnel) . Évalué à 1.

        La page de man de send dit ceci:

        No indication of failure to deliver is implicit in a send(). Locally
        detected errors are indicated by a return value of -1.

        When the message does not fit into the send buffer of the socket,
        send() normally blocks, unless the socket has been placed in nonblock-
        ing I/O mode. In nonblocking mode it would fail with the error EAGAIN
        or EWOULDBLOCK in this case. The select(2) call may be used to deter-
        mine when it is possible to send more data.

        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.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.