我目前正在使用Boost ASIO处理客户端服务器TCP / IP应用程序。 客户端使用以下语句将数据发送到服务器
boost::system::error_code ignored_error;
boost::asio::write(socket, boost::asio::buffer("Hello World\0"), ignored_error);
服务器读取此数据(来自Asynch。读取)
boost::asio::async_read(*sock, boost::asio::buffer(buf_server),boost::bind(&ServerRead,boost::asio::placeholders::error));
这是阅读的地方
boost::array<char, 158> buf_server;
void ServerRead(const boost::system::error_code& error)
{
if(!error)
{
std::cout << "Message: " << buf_server.data() << std::endl;
}
else
{
std::cout << "Error occurred." << error.message() << std::endl;
}
}
但是我收到错误“文件结束”。 所以现在我有两个问题
如何解决此问题。我在这做错了什么?
假设我的buf_server
只有5个字符而不是158.我怎样才能让我的接收器只使用此缓冲区来读取整个数据并std::cout
呢?
答案 0 :(得分:0)
当您指示应用程序读取158个字节但仅发送12个字节时,应该会出现此行为。要解决此问题,您可以发送一个固定大小的标头,指示消息大小,Asio文档中包含的chat client and server示例显示了如何完成此操作,摘自客户端示例:
void handle_connect(const boost::system::error_code& error)
{
if (!error)
{
boost::asio::async_read(socket_,
boost::asio::buffer(read_msg_.data(), chat_message::header_length),
boost::bind(&chat_client::handle_read_header, this,
boost::asio::placeholders::error));
}
}
void handle_read_header(const boost::system::error_code& error)
{
if (!error && read_msg_.decode_header())
{
boost::asio::async_read(socket_,
boost::asio::buffer(read_msg_.body(), read_msg_.body_length()),
boost::bind(&chat_client::handle_read_body, this,
boost::asio::placeholders::error));
}
else
{
do_close();
}
}
void handle_read_body(const boost::system::error_code& error)
{
if (!error)
{
std::cout.write(read_msg_.body(), read_msg_.body_length());
std::cout << "\n";
boost::asio::async_read(socket_,
boost::asio::buffer(read_msg_.data(), chat_message::header_length),
boost::bind(&chat_client::handle_read_header, this,
boost::asio::placeholders::error));
}
else
{
do_close();
}
}
或者,或者使用更具异国情调的协议such as HTTP,直到遇到\r\n
分隔符为止。{/ p>