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, чтобы убедиться, что он отправляет столько байтов, сколько вы думаете.