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
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.
git is great because Linus did it, mercurial is better because he didn't.