C++ Boost ASIO:服务器如何知道客户端是否仍然连接?

C++ Boost ASIO:服务器如何知道客户端是否仍然连接?,c++,tcp,boost-asio,C++,Tcp,Boost Asio,我正在为服务器/客户端应用程序使用boost::asio。服务器一次只接受一个连接。我想知道服务器验证客户端是否仍然连接的最佳方法是什么 这样做的目的是,我希望能够知道客户端是否崩溃,以便我可以重新开始侦听新的连接尝试。在我的应用程序中,我使用以下标志,当客户端断开连接时,我的读数会显示出来。 如果在您的应用程序中使用它,请尝试。仅在连接后应用此标志 在我的例子中,skt\u TCP属于类型boost::asio::ip::TCP::socket int32_t accept_server_so

我正在为服务器/客户端应用程序使用
boost::asio
。服务器一次只接受一个连接。我想知道服务器验证客户端是否仍然连接的最佳方法是什么


这样做的目的是,我希望能够知道客户端是否崩溃,以便我可以重新开始侦听新的连接尝试。

在我的应用程序中,我使用以下标志,当客户端断开连接时,我的读数会显示出来。 如果在您的应用程序中使用它,请尝试。仅在连接后应用此标志

在我的例子中,
skt\u TCP
属于类型
boost::asio::ip::TCP::socket

int32_t accept_server_socket = skt_TCP.native_handle();

int32_t timeout = 8;
int32_t cnt = 2;
int32_t intverval = 2;

// Added Keepalive flag
boost::asio::socket_base::keep_alive opt_keep_alive(true);
skt_TCP.set_option(opt_keep_alive);
setsockopt(accept_server_socket, SOL_TCP, TCP_KEEPIDLE, &timeout, sizeof(timeout));
setsockopt(accept_server_socket, SOL_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt));
setsockopt(accept_server_socket, SOL_TCP, TCP_KEEPINTVL, &intverval, sizeof(intverval));

这实际上取决于您对协议的选择

简单命令协议 如果您的服务器协议始终等待来自客户端的消息,那么对于每个连接的客户端,您将始终有一个挂起的
async\u read
。当客户端以任何方式断开连接时,这应该返回一个错误(EOF)

保持活动状态是如上所述的一种方法,但是挂起的
async\u read
的工作就可以实现这一目的

简单事件协议 一个简单的事件协议包括客户端监听数据,服务器发送数据。在这个协议中,服务器不知道客户端是否在那里,因为客户端只接受数据并继续等待。客户端从不向服务器发送任何消息

这就提出了保持活力的要求<当客户端已经断开连接时,代码>异步写入操作不会以与
异步读取
相同的方式失败


还有其他选择,比如让服务器始终有一个挂起的
async\u read
操作,该操作尝试读取1个字节。当客户端断开与上面讨论的简单命令协议类似的连接时,这将失败,但也不会成功,因为客户端不通过简单事件协议发送数据。

您需要应用程序级心跳-没有其他可靠的方法。
int32\t timeout=8
表示它是8秒?还是毫秒?