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