2010-02-10 7 views
2

J'écris une application en C, en utilisant libpcap. Mon programme écoute de nouveaux paquets et les analyse selon une grammaire. La charge utile est en fait XML. Parfois, un paquet n'est pas suffisant pour un fichier XML. Le tampon XML est donc divisé en paquets distincts. Je veux ajouter une logique de code pour gérer ces cas. Cependant, je ne sais pas à l'avance qu'un paquet ne contient pas toutes les données. Comment puis-je savoir qu'un paquet a plus de données qui seront envoyées ensuite? Comment reconnaître qu'un nouveau paquet contient le reste des données?Programmation TCP/IP, données dans plus d'un paquet

Dois-je utiliser le drapeau TH_FIN? Pourriez-vous m'expliquer s'il vous plaît?

Répondre

2

Il n'y a rien dans TCP qui définit les paquets, c'est aux couches supérieures de définir si elles ont besoin de - TCP est juste un flux. S'il s'agit d'un fichier XML brut sur un flux TCP, vous devez analyser le fichier XML: vous saurez que vous avez un document xml entier lorsque vous avez reçu la fin de l'élément document. S'il s'agit d'un package XML sur HTTP, vous pouvez peut-être analyser l'en-tête Content-Length: qui doit contenir la longueur du corps. Remarque, le réassemblage d'un flux TCP à partir de paquets capturés est un problème très difficile, il y a un lot de cas de coin, par exemple vous auriez besoin de gérer la retransmission, les segments TCP hors séquence et bien d'autres. http://libnids.sourceforge.net/ pourrait vous aider.

0

Si vous utilisez TCP, utilisez une bibliothèque TCP qui vous fournit les données sous forme de flux au lieu d'essayer de gérer vous-même les paquets.

0

Le flux est bon. Une autre option consiste à stocker les données entrantes dans un tampon (par exemple, char *) et à rechercher des caractères de trame de messagerie d'application ou, dans le cas de Xml, la balise de fin racine. Une fois que vous avez trouvé un message XML complet à l'avant du tampon, sortez-le et traitez-le.

1

Comme Anon dit utiliser une bibliothèque de flux de niveau supérieur.

Mais même alors, vous devez connaître le côté du bloc avant de commencer à le manipuler, comme vous le verrez dans le bloc de n octets.

Ainsi vous voulez d'abord envoyer en binaire le nombre d'octets à envoyer, puis envoyer x octets, et répéter, donc lorsque vous recevez les mandrins via select/read de savoir que vous allé avez tous morceau un pour passer au processeur.

+0

Cela ne fonctionnera que si vous êtes la fin, pas si vous reniflez des connexions existantes – leeeroy

+0

D'accord, j'ai raté l'élément sniffing/snooping, et j'ai juste supposé qu'il faisait des sockets à la dure .. –

0

Le protocole de messagerie instantanée XMPP, utilisé par Jabber, permet de déplacer des blocs XML sur un flux TCP. Je ne sais pas exactement comment cela se fait, mais RFC 3290 est la définition du protocole. Vous devriez être capable de travailler à partir de ça.

Questions connexes