2009-02-21 13 views
1

Je suis en train d'écrire un petit serveur Java et un client correspondant en C++, qui implémentent un service de messagerie instantanée simple sur le STOMP protocol.Problème de transmission du caractère nul sur les sockets

Le protocole spécifie que chaque trame (un message qui passe entre le serveur et le client, si vous) doit se terminer par un caractère nul, qui dans le code je me réfère à '\0', aussi bien en Java et en C++.

Cependant, lorsque je transmets une trame sur TCP via des sockets, le caractère nul n'apparaît tout simplement pas de chaque côté. Je travaille avec l'encodage UTF-8, et essayé de passer en ASCII, n'a pas aidé.

Qu'est-ce que je fais mal?

Répondre

2

Que vous encodiez du texte en ASCII ou en UTF-8, vous convertissez vos "lettres" en un flux d'octets (encodages d'octets). Vous devez ajouter un octet ZERO à la fin des chaînes de message.

[Deviner] Vous utilisez peut-être une bibliothèque de haut niveau avec une méthode comme "WriteLine (ligne de chaîne)" pour envoyer les données sur le réseau. La documentation de cette méthode décrivant les octets réellement envoyés, qui inclut généralement le codage du texte du message dans le codage courant (ASCII, UTF-8, etc.) suivi d'une séquence de terminaison de ligne, qui est généralement l'octet 13, 10 m ou une combinaison d'entre eux ('\ n', '\ r \ n'). Utilisez la méthode Write() de bas niveau ou la méthode WriteBytes() (en fonction de vos bibliothèques). Convertissez le texte en ASCII ou en UTF-8, ajoutez l'octet zéro à la fin et envoyez exactement ce que vous voulez envoyer.

1

Je vous recommande de télécharger Wireshark et de surveiller la transmission pour voir si le problème est à l'émission ou à la réception.

0

Transmettez-vous un tampon ou une chaîne? Si vous transmettez une chaîne, le caractère nul mettra fin à la chaîne et ne sera pas transmis. À l'aide d'un tampon, vous pouvez spécifier le nombre d'octets que vous souhaitez transmettre et inclure le caractère nul.

Bien entendu, le problème peut être à la fois du côté de la transmission et du côté réception.

0

La première chose que vous devez faire est d'utiliser Wireshark (ou quelque chose de similaire) comme suggéré par Spencer.

S'il s'agit d'un problème côté transmission, vérifiez que vous codez correctement le message en ajoutant des traces de diagnostic appropriées à votre code.

S'il s'agit d'un problème côté réception, existe-t-il un moyen de configurer le caractère de délimitation sur le socket de réception? Il peut y avoir une option de socket qui indique s'il faut inclure ou exclure le caractère de délimitation. Peut-être que c'est transmis correctement, mais la prise de réception l'enlève.

0

Vous êtes en C++?

Une erreur de débutant met le NUL à la fin de la chaîne: "Foo!\x00".

Bien sûr, le ting qui écrit la chaîne traite cette première NUL comme la fin de la chaîne, et ne la transmet pas. Vous devez blanc le caractère nul '\x00' explicitement comme un caractère (avec putChar ou C++ mais le fait), pas dans le cadre d'une chaîne.