Boost :: Asio - Удалите «null» - Шарактер в конце пакетов TCP
-
24-10-2019 - |
Вопрос
Я пытаюсь сделать простой клиент MSN в основном для развлечения, но и для образовательных целей. И я начал пробовать какой-нибудь пакет TCP, отправляя и получая, используя Boost Asio, так как я хочу кроссплатформенную поддержку. Мне удалось отправить «VER»-Комманд и получить его ответ.
Однако после того, как я отправляю следующий «cvr» -command, Asio бросает «конец файла» -еррора. После некоторых дальнейших исследований я обнаружил, что пакетный пакет, который приносят пакет, что мои пакеты TCP на сервере Messenger получили дополнительный «нулевый» -характер (ASCII код: 00) в конце сообщения. Это означает, что в конце концов, мой версический коммерческий получает дополнительный символ, который я не думаю, что сервер Messenger похож и, следовательно, закрывает соединение, когда я пытаюсь прочитать ответ 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, которую я использую.
Надеюсь, я был достаточно ясен.
Решение
Когда вы строите буфер, вы передаете его массивом. Но массив содержит следующий нулевый терминатор. Передайте второй аргумент в буфер, указывающий длину без последнего размера байта (sendbuf) -1
Другие советы
Вы должны проверить код возврата из Boost :: Asio :: Напишите, чтобы убедиться, что он отправляет столько байтов, сколько вы думаете.