如何使用boost来冲洗插座

时间:2010-07-27 15:36:22

标签: sockets boost-asio

我正在实现一个使用boost将xml发送到客户端的服务器。我面临的问题是缓冲区不会立即发送并累积到一个点然后发送整个事情。这会导致我的客户端出现问题,当它解析xml时,它可能有不完整的xml标记(不完整的消息)。每当需要发送消息时,是否有一种方法可以刷新套接字?下面是服务器的写代码。

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 个答案:

答案 0 :(得分:1)

通常,在使用TCP字节流创建应用程序时,发送方会发送一个固定长度的标头,以便接收方知道要预期的字节数。然后接收器读取那么多字节并将生成的缓冲区解析为XML对象。

答案 1 :(得分:1)

我假设你正在使用TCP连接。 TCP是流类型,因此您不能假设您的数据包将包含在一个大数据包中。您需要修改通信设计,首先发送大小长度,如San Miller答案,或者在发送所有xml数据后发送标志或分隔符。

答案 2 :(得分:0)

假设你肯定要在要清除的套接字上有一些数据,你可以这样做:

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_是成员变量。

HTH