boost :: asio :: streambuf пусто? - PullRequest
3 голосов
/ 15 апреля 2011

Я использую boost :: asio :: streambuf для записи ostream в мой сокет boost.

Name name;
name.set_name("platzhirsch");

boost::asio::streambuf b;
std::ostream os(&b);

ZeroCopyOutputStream *raw_output = new OstreamOutputStream(&os);
CodedOutputStream *coded_output = new CodedOutputStream(raw_output);

coded_output->WriteVarint32(name.ByteSize());
name.SerializeToCodedStream(coded_output);

socket.send(b.data());

Однако size_t, возвращаемое send, равно 0. Я подозреваю, что данные вообще не отправляются,Кроме того, потому что клиентский сокет бросает ужасные исключения.Я спрашиваю, есть ли что-то странное в моем коде.

Другими словами, могу ли я проверить, является ли streambuf пустым или действительно ли записанные в него данные есть.

Ответы [ 2 ]

3 голосов
/ 15 апреля 2011

Не уверен насчет вашего кода.Это работает для меня:

    boost::asio::streambuf request;
    std::ostream request_stream(&request);
    request_stream << "GET " << queryArgs << " HTTP/1.0\r\n";
    request_stream << "Host: " << serverIp  /* "192.168.0.70" */ << "\r\n";
    request_stream << "Accept: */*\r\n";
    request_stream << "Connection: close\r\n\r\n";

    // Send the request.
    boost::asio::write(socket, request);
1 голос
/ 15 апреля 2011

Это не было проблемой boost :: asio, это была проблема с Google protobuf. * ​​1001 *

Чтобы очистить CodedOutputStream, их необходимо удалить:

ZeroCopyOutputStream *raw_output = new OstreamOutputStream(&os);
CodedOutputStream *coded_output = new CodedOutputStream(raw_output);

coded_output->WriteVarint32(name.ByteSize());
name.SerializeToCodedStream(coded_output);

delete coded_output;
delete raw_output;

socket.send(b.data());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...