2011-01-28 3 views
1

J'essaie de recevoir des données d'un serveur et de les analyser.C winsock "analyse par roulement"

http://pastebin.com/1kjXnXwq http://pastebin.com/XpGSgRBh

tout fonctionne comme il est, mais je veux analyser les données au lieu de simplement saisir des blocs et de l'imprimer. Il est donc possible de récupérer les données de winsock jusqu'à \ n puis de les arrêter et de les passer à une autre fonction à analyser et une fois que cette fonction revient, continuer à lire depuis le dernier point jusqu'à ce que \ n apparaisse et répète le processus. Plus rien à recevoir?

La fonction supposée faire cela s'appelle msgLoop() et se trouve dans la deuxième ligne pastebin.

Répondre

1

Il n'y a pas de méthode "readLine" intégrée pour les sockets. Donc, vous devrez l'implémenter vous-même, mais ce n'est pas trop compliqué. Je trouve cet exemple par googler, vous pourriez être en mesure de l'améliorer:

http://johnnie.jerrata.com/winsocktutorial/

3

Pour lire une \n chaîne à partir d'une prise à terminaison, vous devez soit:

  1. lire le socket 1 octet à la fois jusqu'à ce que vous rencontriez un octet \n. Tous les octets non lus sont laissés dans le socket jusqu'à ce que vous les lisiez plus tard. Ce n'est pas très efficace, mais ça fonctionne.

  2. créer un cache de données. Lorsque vous avez besoin d'une nouvelle chaîne, vérifiez d'abord si le cache contient déjà un octet \n. Si ce n'est pas le cas, continuez à lire depuis le socket dans des blocs plus grands et stockez-les dans le cache jusqu'à ce que vous rencontriez un octet \n. Traitez ensuite le contenu du cache jusqu'au premier \n octet, supprimez les octets que vous avez traités et déplacez les octets restants vers l'avant du cache pour les lectures ultérieures.