c++ - 提升asio服务器以了解客户端何时关闭套接字

标签 c++ boost-asio

我有一个运行良好的客户端服务器应用程序。 客户端向服务器发送一些消息,然后关闭套接字(在套接字上调用 shutdown 和 close())

服务器端读取数据的代码如下所示:

while (1)
{
    try
    {
        int headerBytesReceived = asio::read( *sock.get(), boost::asio::buffer(inbound_header_) );
        std::cout << "headerBytesReceived : " << headerBytesReceived << "\n" << std::flush;
        //.......
        //.......
    }
    catch (system::system_error &e)
    {
        std::cout << "Server Error occured! Error code = "
            << e.code() << ". Message: "
            << e.what() << "\n";
        break;
    }
}

服务端在一个线程中无限循环读取数据。 现在,当客户端关闭套接字时,我想优雅地跳出循环。 现在,在客户端发送完消息并关闭其套接字后,将调用 catch 并出现以下错误:

发生服务器错误!错误代码 = asio.misc:2。消息:已读:文件结束

有没有更好的方法可以让我在 catch 中发现连接已经关闭并且我需要打破循环?通过检查错误代码? 当然,我可以删除 cout 语句,但出于记录目的,我想知道错误是什么。

最佳答案

如果两端执行成功 shutdown,错误将是boost::asio::error::eof,表示没有更多数据可用。

当然你可以使用 boost::asio::read使用 boost::system::error_code 重载以防止异常。这甚至可能是更好的处理方式。

您可以检查错误,并记录连接已成功关闭。

关于c++ - 提升asio服务器以了解客户端何时关闭套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47509455/

相关文章:

c++ - openGL 着色器错误

c++ - 在 Linux 上以编程方式获取准确的 CPU 缓存层次结构信息

c++ - 使用 C++ MJPEG 流媒体服务器时缺少 boost::asio 随机 header

c++ - 演示文稿错误 :Word Reversal

c++ - 结果传递的递归 x3 解析器

c++ - 从方法 C++ 返回对象

c++ - 修改系统时钟时,boost::deadline_timer 可能会失败

c++ - boost asio 的链接器问题

c++ - io_service::poll_one 非确定性行为

sockets - boost asio udp waitForReadyRead