2

我正在使用 boost 库来创建一个服务器应用程序。一次只允许一个客户端,因此如果调用 async_accept(...) 函数,则接受器将被关闭。

我的服务器的唯一工作是定期向客户端发送数据(如果在服务器上启用了发送,否则“就坐在那里”直到它被启用)。因此,我有一个提升消息队列 - 如果消息到达,则在套接字上调用 send()。

我的问题是我无法判断客户是否还在听。通常你不会在意,到下一次传输时,发送会产生错误。

但在我的情况下,当打开套接字时接受器没有打开。如果套接字进入 CLOSE_WAIT 状态,我必须关闭它并再次打开接受器,以便客户端可以再次连接。

等到下一次发送也是没有选择的,因为发送可能被禁用,因此我的服务器会被卡住。

问题:如何确定 boost::asio::ip::tcp::socket 是否处于 CLOSE_WAIT 状态?

4

2 回答 2

1

您可以尝试使用 ip::tcp::socket::get_option 并使用级别 SOL_SOCKET 和选项名称 SO_ERROR 获取错误状态。我很惊讶我还没有找到现成的 boost 实现。因此,您可以尝试满足 GettableSocketOption 要求并使用 ip::tcp::socket::get_option 来获取套接字错误状态。

于 2013-09-07T05:50:31.323 回答
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.
于 2015-05-13T15:24:50.837 回答