2010-04-23 4 views
0

J'ai écrit un serveur HTTP IOCP très simple qui fonctionne pour le verbe GET, mais pas POST.C++ Windows IOCP - Données HTTP POST manquantes

Je crée un socket et un thread d'écoute dans lequel accept() attend une connexion. Lorsqu'un client se connecte, j'appelle ioctlsocket() pour débloquer le socket puis j'associe le socket à IOCP et enfin j'appelle WSARecv() pour lire les données.

Certaines données sont en effet lues et lorsque cela s'est produit, IOCP réveille un thread de travail via GetQueuedCompletionStatus() et je récupère les données de la requête.

Je reçois seulement l'en-tête de demande quand je POSTE à partir de n'importe quel navigateur. Des suggestions sur pourquoi?

Répondre

2

Toutes les lectures sur un socket TCP retournera n'importe où entre 1 octet et la quantité totale envoyée en fonction de la taille de la mémoire tampon du tampon que vous fournissez. Ce qui se passe probablement, c'est que le serveur Web envoie les données sous la forme de deux écritures distinctes et que ces données sont transmises par la pile TCP du serveur sous la forme de deux blocs de données distincts. Votre lecture se termine parce que les données sont arrivées. La lecture n'attend pas que toutes les données attendues par le programmeur soient arrivées ou même jusqu'à ce que votre tampon soit plein.

Les problèmes de réseau peuvent encore compliquer les choses car les routeurs peuvent fragmenter les choses et les données perdues peuvent retarder les choses quand elles sont renvoyées.

Toujours lorsque vous travaillez avec TCP, vous devez supposer que vos lectures retourneront toujours un seul octet à la fois et coderont en conséquence; De cette façon, les choses fonctionneront toujours.

Vous devriez juste émettre une autre lecture et vous obtiendrez le reste des données quand il est arrivé.

Vous voudrez peut-être jeter un oeil à mon framework de serveur IOCP gratuit (il fait aussi des clients) qui peut être trouvé here; On dirait que vous avez déjà des choses qui fonctionnent, mais parfois, vous pouvez regarder une façon différente de faire les choses.

Lorsque j'ai besoin d'accumuler des données avant le traitement, j'ai tendance à adopter l'approche suivante. Émettez une lecture et attendez qu'elle se termine, regardez ce que j'ai et, si je n'ai pas tout ce dont j'ai besoin et que mon tampon contient encore de l'espace, ajustez le WSABUF que j'utilise pour qu'il pointe vers la fin des données actuelles qui viennent d'arriver dans le même tampon et émettent une autre lecture; nous accumulons ensuite dans le même tampon jusqu'à ce que j'ai suffisamment de données pour le traiter ou que je doive ajouter un autre tampon pour en avoir plus.