gérer la fonction recv () bloquée sans connaître la longueur du message avant et ne pas vouloir utiliser les E / S asy

Je suis en train de créer un serveur très simple qui accepte les requêtes http du navigateur (Safari) et répond en retour à certaines réponses HTTP telles que le message “Hello World”.

Mon programme a été bloqué sur la fonction recv () car il ne sait pas si le client (navigateur) a fini d’envoyer la requête HTTP et recv () est une fonction de blocage. (Une question très typique)

La réponse la plus populaire que j’ai trouvée est d’envoyer la longueur du message avant d’envoyer le message. Cette solution est bonne mais elle ne fonctionne pas pour moi car je ne contrôle pas ce qui est envoyé par le client. Et pour autant que je sache, le navigateur n’envoie aucune longueur de message avant d’envoyer le vrai message.

La deuxième réponse la plus populaire à utiliser asy I / O comme select () ou poll (). Mais, personnellement, je ne pense pas que ce soit vraiment une bonne stratégie car une fois que j’ai déjà reçu tout le message de demande du client, alors, bien sûr, je voudrais passer à l’étape suivante pour traiter la demande. Pourquoi devrais-je encore perdre mon temps et mes ressources à attendre quelque chose qui ne viendra jamais même si cela ne bloque plus? (La création de threads pose une question similaire)

La solution que j’ai trouvée consiste à vérifier si la taille du message reçu est égale à la taille du tampon. Par exemple, disons que je mets le recvBufferSize à 32 et que la taille totale du message de demande est de 70. Je recevrai alors trois paquets de taille 32, 32 et 6 respectivement. Je peux dire que le client termine l’envoi de la demande car la taille du dernier paquet n’est pas égale à la recvBuffersize (32).

Cependant, comme vous pouvez le voir, des problèmes surviennent lorsque la taille du message de requête est 64/96/128 ……

D’autres approches peuvent ressembler à un délai d’attente, mais je ne suis pas sûr qu’elles soient bonnes ou non.

Et je veux construire tout par moi-même pour ne pas être intéressé par une bibliothèque comme zeromq ou Boost.Asio

Est-ce que certaines personnes peuvent donner des conseils sur mon approche ou proposer d’autres moyens pour résoudre le problème? Merci beaucoup!

Si vous implémentez le protocole HTTP, vous devez étudier les RFC HTTP. Il existe différentes manières de connaître la longueur de la requête, en commençant par l’en Content-length tête Content-length et les longueurs combinées des blocs si le client utilise un codage de transfert en blocs.