Question

J'ai été chargé de créer un outil pour notre service d'assurance qualité qui peut lire des paquets hors du fil et réassembler les messages correctement (ils ne font pas confiance à nos journaux ... longue histoire).

L'application dont la communication que je tente d'écouter les utilise classes TcpListener et tcpclient de .NET pour communiquer. Intercepter les paquets ne sont pas un problème (j'utilise SharpPcap ). Cependant, correctement réassembler les paquets dans les messages de niveau d'application se révèle un peu difficile.

Certains paquets ont la fin d'un message et le début du message suivant en eux et je ne peux pas comprendre comment l'objet NetworkStream dans .NET est capable de dire où un message de niveau d'application se termine et l'autre commence.

Je suis en mesure de comprendre que tout paquet qui contient la fin d'un message de niveau d'application aura l'en-tête TCP « PSH » (Push) drapeau allumé. Mais je ne peux pas comprendre comment .NET sait où exactement la fin du message se trouve dans ce paquet.

Les données d'un paquet pourrait ressembler à:

/></Message><Message><Header fromSystem=http://blah

Comment le flux ne sait à envoyer jusqu'à la fin de </Message> à l'application et stocker le reste jusqu'à ce que le reste du message est complet?

Il n'y a pas d'indicateurs de niveau IP définies pour la fragmentation, et les prises de courant .NET ont aucune connaissance du protocole de niveau d'application. Donc, je trouve cela incroyablement frustrante. Toute idée serait appréciée.

Était-ce utile?

La solution

Le flux ne connaît pas la fin de quelque chose - il devrait faire partie du protocole d'application

.

NetworkStream n'a rien construit en elle pour convertir les données en un objet. Qu'est-ce que vous fait penser qu'il fait? Qu'est-ce que le code qui parvient à utiliser comme regarder NetworkStream? Faites-vous peut-être une certaine forme de XML désérialisation, et lecture de code arrête automatiquement lorsqu'il atteint la balise de fermeture?

En gros:

  • Si votre protocole n'a pas delimiter de message ou préfixe de longueur, il devrait probablement
  • NetworkStream lui-même est très peu probable à faire quoi que ce soit intelligent -. Mais si vous pouviez nous dire ce que vous observez, nous pouvons peut-être travailler sur ce qui se passe
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top