从客户端接收数据时出现异常 - "End of file"错误
Exception while receiving data from client - "End of file" error
我目前正在使用Boost ASIO的客户端服务器TCP/IP应用程序。客户端使用以下语句
向服务器发送数据boost::system::error_code ignored_error;
boost::asio::write(socket, boost::asio::buffer("Hello World "), ignored_error);
服务器读取这些数据(从异步)。读)
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
它?
当您指示应用程序读取158个字节但只发送12个字节时,应该会出现这种行为。要解决这个问题,您可以发送一个固定大小的头,指示消息大小,Asio文档中包含的聊天客户端和服务器示例展示了如何实现这一点,这是客户端示例的摘录:
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();
}
}
或者使用更奇特的协议,例如HTTP,在那里您读取直到遇到rn
分隔符。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 处理多个异常集合的C++方法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 从客户端接收数据时出现异常 - "End of file"错误
- 抛出异常并忽略"reaches end of non-void function"警告不好吗?