Boost :: Asio - Удалите «null» - Шарактер в конце пакетов TCP

StackOverflow https://stackoverflow.com/questions/2978641

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top