【发布时间】:2014-10-06 00:29:24
【问题描述】:
我将我的 PC 用作服务器。客户端发送如下消息:“PART1:Part2”,服务器执行必要的操作。我使用 boost 的 asio 作为服务器代码。
void start_read()
{
boost::asio::async_read(socket_, input_buffer_,
boost::asio::transfer_at_least(1),
boost::bind(&tcp_connection::handle_read, shared_from_this(),
boost::asio::placeholders::error));
}
// When stream is received handle the message from the client
void handle_read(const boost::system::error_code& error)
{
if (!error)
{
boost::asio::streambuf::const_buffers_type bufs = input_buffer_.data();
std::string msgstr(boost::asio::buffers_begin(bufs),
boost::asio::buffers_begin(bufs) +
input_buffer_.size());
std::vector<std::string> msgVector;
boost::split(msgVector, msgstr, boost::is_any_of(":"));
messageFromClient_ = msgVector[0];
valueFromClient_ = msgVector[1];
};
每秒向服务器发送消息,生成的 msgstr 如下所示:
PART1:part2a
PART1:part2bPART1:part2b
PART1:part2cPART1:part2cPART1:part2c
PART1:part2dPART1:part2dPART1:part2dPART1:part2d
这不是我想要的。我不想包含上一个缓冲区中的数据,即我想要这个:
PART1:part2a
PART1:part2b
PART1:part2c
PART1:part2d
我知道问题很可能出在此处:
std::string msgstr(boost::asio::buffers_begin(bufs),
boost::asio::buffers_begin(bufs) +
input_buffer_.size());
但是,我找不到适用于我的情况的正确代码。
编辑: 尝试这样做:
std::istream response_istream(&input_buffer_);
std::string msgstr;
response_istream >> msgstr;
前 3 次,我得到了我需要的信息,但随后消息成倍增加。总是这样:
PART1:part2a
PART1:part2b
PART1:part2c
PART1:part2dPART1:part2d
PART1:part2ePART1:part2e
PART1:part2fPART1:part2fPART1:part2fPART1:part2f
PART1:part2gPART1:part2g
提前非常感谢。
【问题讨论】:
标签: c++ asynchronous buffer boost-asio tcpserver