2010-06-05 17 views
0

J'essaye de faire un simple client msn principalement pour le fun mais aussi à des fins éducatives. Et j'ai commencé à essayer l'envoi et la réception de paquets tcp en utilisant Boost Asio car je veux un support multiplateforme. J'ai réussi à envoyer une commande "VER" et recevoir sa réponse. Cependant, après avoir envoyé la commande "CVR" suivante, Asio lance un "End of file" -error. Après quelques recherches plus approfondies, j'ai trouvé par reniflage de paquets que mes paquets tcp vers le serveur de messagerie avaient un caractère "nul" supplémentaire (code Ascii: 00) à la fin du message. Cela signifie que ma commande VER obtient un caractère supplémentaire à la fin que je ne pense pas que le serveur de messagerie aime et donc arrête la connexion lorsque j'essaie de lire la réponse CVR.Boost :: Asio - Supprime le caractère "null" à la fin des paquets tcp

Voici comment mon paquet ressemble quand reniflant, (il est Payload):

(Hex :) 56 45 52 20 31 20 4d 53 4E 50 31 35 20 43 56 52 30 0a 0a 00
(Char :) VER 1 MSNP15 CVR 0 ...

et voici comment paquet de Adium (chat client pour OS X) ressemble:

(Hex :) 56 45 52 20 31 20 4d 53 50 4E 31 35 20 43 56 52 30 0d 0a
(Char :) VER 1 MSNP15 CVR 0 ..

Donc, ma question est de savoir s'il y a moyen de supprimer le caractère nul à la fin de chaque paquet, si j'ai mal compris quelque chose et utilisé Asio dans le mauvais sens. Ma fonction d'écriture (légèrement modifié) ressemble Lite ceci:

int sendVERMessage() { 
    boost::system::error_code ignored_error; 
    char sendBuf[] = "VER 1 MSNP15 CVR0\r\n"; 
    boost::asio::write(socket, boost::asio::buffer(sendBuf), 
         boost::asio::transfer_all(), ignored_error); 
    if(ignored_error) { 
     cout << "Failed to send to host!" << endl; 
     return 1; 
    } 

    cout << "VER message sent!" << endl; 
    return 0; 
} 

et de la documentation principale here sur le protocole msn j'utilise.

J'espère avoir été assez clair.

+0

Veuillez modifier votre question pour organiser votre code correctement –

Répondre

1

Lorsque vous construisez un tampon, vous lui passez un tableau. Mais le tableau contient un terminateur null à la fin. Passez le deuxième argument au tampon indiquant la longueur sans le dernier octet sizeof (sendBuf) -1

+0

Merci! Cela a résolu le problème (: après 2 ans de codage java au lieu de C++, vous semblez oublier ces détails. – Shump

0

Vous devriez vérifier le code de retour de boost :: asio :: write pour vérifier qu'elle l'envoi d'autant d'octets que vous pensez qu'il est.

+0

boost :: asio :: write renvoie 20, ce qui signifie qu'il envoie ce caractère nul supplémentaire que je ne veux pas. – Shump