Partage
  • Partager sur Facebook
  • Partager sur Twitter

lire les données d'une scoket

    14 novembre 2019 à 21:49:50

    bonjour

    j'ouvre une socket avec un serveur, puis je lis les données avec

    ssize_t recv(int socket, void *buffer, size_t length, int flags);

    mais quand est-ce que je sais quand il n'y a plus rien à lire.
    si je fais un while(1) dessus quand c'est fini ça bloque et ça attends. mais ca pourrait tres bien etre le reseau qui est lent...
    donc je ne sais pas comment faire dans mon programme pour dire que c'est fini
    • Partager sur Facebook
    • Partager sur Twitter
      14 novembre 2019 à 22:41:47

      Envoyer par le socket un message disant que c'est fini.
      • Partager sur Facebook
      • Partager sur Twitter
        14 novembre 2019 à 23:54:30

        When a stream socket peer has performed an orderly shutdown, the return  value  will  be  0
               (the traditional "end-of-file" return).

        Donc tu regardes si le retour est 0.
        • Partager sur Facebook
        • Partager sur Twitter
          15 novembre 2019 à 7:27:19

          @michel ce n'est pas moi qui gère le serveur donc je n'ai aucun controle de ce ôte

          @amarok, non quand il n'y a plus rien à lire, mon programme attends sur la fonction recv mais ne renvoie pas 0 contrairement à ce que je pensais aussi

          • Partager sur Facebook
          • Partager sur Twitter
            15 novembre 2019 à 8:54:29

            Erreur de débutant en programmation réseau.

            L'appel à la fontion recv est bloquant par défaut et de plus, cette fonction ne te donnera pas forcément la totalité du message en un seul morceau. Si ton serveur t'envoie "hello world" tu pourras très bien avoir besoin de faire 2 recv pour avoir la totalité du message.

            Dans ton cas simple, tu peux faire un while sur la condition de fin de message. Par exemple, beaucoup de protocoles utilisent \r\n comme délimiteurs de messages (IRC, SMTP, HTTP plus au moins) ainsi tu peux boucler sous la forme (pseudo code)

            // PSEUDO CODE
            while (!message_is_complete(msg)) {
                recv(buffer);
                // tout l'intérêt est ici, on ajoute ce qu'on vient de lire à 'msg' pour former le message complet.
                append_to_message(msg, buffer);
            }
            

            Cependant, la manière la plus propre est d'utiliser un multiplexeur comme select (POSIX) ou les alternatives plus performances par système (poll, epoll, kqueue, etc) et d'ensuite lire sans bloquer.

            Autres note : mes VDD parlent d'un retour de 0 pour recv. C'est effectivement le cas si le socket côté serveur a cloturé le socket. C'est le cas pour les requêtes one-shot (exemple HTTP) mais pas sur les serveurs qui attendent des requêtes indéfiniment (FTP, IRC, IMAP, ...)

            -
            Edité par markand 15 novembre 2019 à 8:57:19

            • Partager sur Facebook
            • Partager sur Twitter

            git is great because Linus did it, mercurial is better because he didn't.

            lire les données d'une scoket

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown