我有一个运行良好的客户端服务器应用程序。 客户端向服务器发送一些消息,然后关闭套接字(在套接字上调用 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/