Boost :: Asio - удаляет нулевой символ в конце пакетов tcp - PullRequest
0 голосов
/ 05 июня 2010

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

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

Вот так выглядит мой пакет при его прослушивании (это полезная нагрузка):

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

1 голос
/ 05 июня 2010

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

0 голосов
/ 05 июня 2010

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

...