Как промыть сокет с помощью boost - PullRequest
1 голос
/ 27 июля 2010

Я внедряю сервер, который отправляет xml клиентам, используя boost. Проблема, с которой я сталкиваюсь, заключается в том, что буфер отправляется не сразу, а накапливается до некоторой точки, а затем отправляет все целиком. Это вызывает проблему на моей стороне клиента, когда он анализирует xml, у него может быть неполный тег xml (неполное сообщение). Есть ли способ в boost, чтобы очистить сокет всякий раз, когда ему нужно отправить сообщение? Ниже приведен код записи сервера.

void 
ClientConnection::handle_write(const boost::system::error_code& error)
{

    if (!error)
    {

        m_push_message_queue.pop_front ();
        if (!m_push_message_queue.empty () && !m_disconnected)
        {

             boost::asio::async_write(m_socket,
            boost::asio::buffer(m_push_message_queue.front().data(), 
                        m_push_message_queue.front().length()),
                boost::bind(&ClientConnection::handle_write, this,
                boost::asio::placeholders::error));
        }
    }
    else
    {
      std::err << "Error writting out message...\n";
      m_disconnected = true;
      m_server->DisconnectedClient (this);

    }
}

Ответы [ 3 ]

1 голос
/ 01 сентября 2010

Я предполагаю, что вы используете TCP-соединение. TCP является потоковым типом, поэтому вы не можете предполагать, что ваш пакет будет входить в один большой пакет. Вам необходимо исправить свой дизайн связи, отправив сначала длину размера, такую ​​как ответ Сан-Миллера, или отправив флаг или разделитель после отправки всех данных xml.

1 голос
/ 27 июля 2010

Обычно при создании приложений с использованием потоков байтов TCP отправитель отправляет заголовок фиксированной длины, чтобы получатель знал, сколько байтов ожидать.Затем получатель считывает столько байтов и анализирует полученный буфер в объект XML.

0 голосов
/ 21 февраля 2012

Предполагая, что у вас определенно будут данные в сокете, который вы хотите очистить, вы можете сделать что-то вроде этого:

void fulsh_socket()
{
    boost::asio::streambuf b;
    boost::asio::streambuf::mutable_buffers_type bufs = b.prepare(BUFFER_SIZE);
    std::size_t bytes = socket_.receive(bufs); // !!! This will block until some data becomes available
    b.commit(bytes);
    boost::asio::socket_base::bytes_readable command(true);
    socket_.io_control(command); 

    while(command.get())
    {
        bufs = b.prepare(BUFFER_SIZE);
        bytes = socket_.receive(bufs);
        b.commit(bytes);
        socket_.io_control(command); // reset for bytes pending
    }
    return;
}

где socket_ - переменная-член.* НТН

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