Boost::Asio - удаляет нулевой символ в конце пакетов tcp

Я пытаюсь сделать простой MSN-клиент в основном для развлечения, но и для образовательных целей. И я начал пробовать отправку и получение некоторых tcp-пакетов с помощью Boost Asio, так как мне нужна кроссплатформенная поддержка. Мне удалось отправить команду "VER" и получить ее ответ.

Однако после того, как я отправил следующую команду "CVR", Asio вызывает ошибку "End of file". После некоторых дальнейших исследований я обнаружил, что, прослушивая пакеты, мои tcp-пакеты на мессенджер получили дополнительный нулевой символ (код Ascii: 00) в конце сообщения. Это означает, что моя команда VER в конце получает дополнительный символ, который, на мой взгляд, не подходит серверу обмена сообщениями, и поэтому закрывает соединение, когда я пытаюсь прочитать ответ CVR.

Вот как выглядит мой пакет при его прослушивании (это 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...

и вот как выглядит пакет Adium(чат-клиент для OS X):

(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..

Поэтому мой вопрос: есть ли способ удалить нулевой символ в конце каждого пакета, если я что-то неправильно понял и неправильно использовал Asio. Моя функция записи (слегка отредактированная) выглядит так:

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

И вот основная документация по протоколу MSN, который я использую.

Надеюсь, я был достаточно ясен.

2 ответа

Решение

Когда вы создаете буфер, вы передаете ему массив. Но массив содержит завершающий нулевой терминатор. Передать второй аргумент в буфер, указывающий длину без последнего байта sizeof(sendBuf)-1

Вы должны проверить код возврата из boost::asio::write, чтобы убедиться, что он отправляет столько байтов, сколько вы думаете.

Другие вопросы по тегам