views:

116

answers:

2

I'm trying to make a simple msn client mostly for fun but also for educational purposes. And I started to try some tcp package sending and receiving using Boost Asio as I want cross-platform support. I have managed to send a "VER"-command and receive it's response.

However after I send the following "CVR"-command, Asio casts an "End of file"-error. After some further researching I found by packet sniffing that my tcp packets to the messenger server got an extra "null"-character (Ascii code: 00) at the end of the message. This means that my VER-command gets an extra character in the end which I don't think the messenger server like and therefore shuts down the connection when I try to read the CVR response.

This is how my package looks when sniffing it, (it's 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...

and this is how Adium(chat client for OS X)'s package looks:

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

So my question is if there is any way to remove the null-character in the end of each package, of if I've misunderstood something and used Asio in a wrong way. My write function (slightly edited) looks lite this:

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;
}

And here's the main documentation on the msn protocol I'm using.

Hope I've been clear enough.

A: 

You should check the return code from boost::asio::write to ensure it's sending as many bytes as you think it is.

Sam Miller
boost::asio::write returns 20 which must mean that it is sending that extra null-character that I don't want.
A: 

When you construct a buffer, you pass it an array. But the array contains trailing null terminator. Pass second argument to buffer indicating length without last byte sizeof(sendBuf)-1

dimba
Thanks! That solved the problem (: After 2 years of java coding instead of c++ you seem to forget those details.