我正在使用boost库来创建服务器应用程序。一次允许一个客户端,因此如果调用async_accept(...)函数,则将关闭接受器。
我的服务器唯一的工作是定期发送数据(如果在服务器上启用了发送,否则“只是坐在那里”,直到它被启用)到客户端。因此我有一个提升消息队列 - 如果消息到达,则在套接字上调用send()。
我的问题是,我无法判断客户端是否仍在收听。通常你不会关心,通过下一次传输,发送会产生错误。
但在我的情况下,打开套接字时不会打开接受器。如果套接字进入CLOSE_WAIT状态,我必须关闭它并再次打开接受器,以便客户端可以再次连接。
等待直到下一次发送也没有选项,因为发送可能被禁用,因此我的服务器将被卡住。
问题: 如何确定boost :: asio :: ip :: tcp :: socket是否处于CLOSE_WAIT状态?
答案 0 :(得分:1)
您可以尝试使用ip :: tcp :: socket :: get_option并获取级别为SOL_SOCKET且选项名称为SO_ERROR的错误状态。我很惊讶我没有为它找到准备好的提升实现。因此,您可以尝试满足GettableSocketOption要求,使用ip :: tcp :: socket :: get_option来获取套接字错误状态。
答案 1 :(得分:1)
以下是Dmitry Poroh建议的代码:
typedef asio::detail::socket_option::integer<ASIO_OS_DEF(SOL_SOCKET),SO_ERROR>so_error;
so_error tmp;
your_socket.get_option(tmp);
int value=tmp.value();
//do something with value.