你能在boost asio中设置SO_RCVTIMEO和SO_SNDTIMEO套接字选项吗?

Bri*_*ndy 5 c++ boost boost-asio

你能在boost asio中设置SO_RCVTIMEO和SO_SNDTIMEO套接字选项吗?

如果是这样的话?

注意我知道你可以使用计时器,但我想特别了解这些套接字选项.

Bri*_*ian 4

绝对地!Boost ASIO 允许您访问本机/底层数据,在本例中是 SOCKET 本身。那么,假设您有:

boost::asio::ip::tcp::socket my_socket;
Run Code Online (Sandbox Code Playgroud)

假设您已经调用了openorbind或某个实际上可用的成员函数my_socket。然后,要获取底层 SOCKET 值,请调用:

SOCKET native_sock = my_socket.native();
int result = SOCKET_ERROR;

if (INVALID_SOCKET != native_sock)
{
    result = setsockopt(native_sock, SOL_SOCKET, <the pertinent params you want to use>);
}
Run Code Online (Sandbox Code Playgroud)

所以你有它!Boost 的 ASIO 可以让您比其他方式更快地完成许多事情,但有很多事情您仍然需要普通套接字库调用。这恰好是其中之一。

  • 除了最低级别的 send/recv 函数外,所有函数都有 for (;;) 循环围绕显式捕获 EAGAIN 的调用。这实际上使 SO_{SND,RCV}TIMEO 选项毫无用处,除非您丢弃 Boost 中 95% 的发送/接收函数。因此,它们允许您设置选项是没有意义的,因为利用它的唯一方法是不使用库的其余部分...... (3认同)