【问题标题】:IPPROTO_TCP or SOL_SOCKETIPPROTO_TCP 或 SOL_SOCKET
【发布时间】:2019-12-14 17:15:15
【问题描述】:

我在 TCP 套接字上的对等方之间有一个简单的 P2P 连接。我的客户端和服务器都在 Linux 上运行。我已经在两边的 TCP 套接字上打开了TCP keep_alive functionality。我正在使用boost::asio 来连接、读取两边我的 tcp 套接字上的写入数据。

tcp keep_alive 示例使用 IPPROTO_TCPSOL_SOCKET,这令人困惑。以下是我在套接字上设置的属性。但我很困惑是使用IPPROTO_TCP 还是SOL_SOCKET,因为它们在两个平台上都编译得很好。

代码:

int on = 1;
setsockopt(socketNativeHandle, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(int)
int timeOut = 3; //seconds
setsockopt(socketNativeHandle, IPPROTO_TCP, TCP_KEEPIDLE, &timeOut, sizeof(int)
setsockopt(socketNativeHandle, IPPROTO_TCP, TCP_KEEPINTVL, &timeOut, sizeof(int))
int unackCount = 1;
setsockopt(socketNativeHandle, IPPROTO_TCP, TCP_KEEPCNT, &unackCount, sizeof(int))

int on = 1;
setsockopt(socketNativeHandle, SOL_SOCKET, TCP_NODELAY, &on, sizeof(int)
int timeOut = 3; //seconds
setsockopt(socketNativeHandle, SOL_SOCKET, TCP_KEEPIDLE, &timeOut, sizeof(int)
setsockopt(socketNativeHandle, SOL_SOCKET, TCP_KEEPINTVL, &timeOut, sizeof(int))
int unackCount = 1;
setsockopt(socketNativeHandle, SOL_SOCKET, TCP_KEEPCNT, &unackCount, sizeof(int))

问题:
我应该在两边都使用SOL_SOCKET,还是应该在两边都使用IPPROTO_TCP?有没有办法在运行时决定这个?请注意,我有非常简单的点对点 wifi 连接。

【问题讨论】:

  • 成功编译是必要的,但不足以证明正确性。它们中的哪一个实际上有效?您当然不需要在运行时决定这一点。
  • IPPROTO_TCP 似乎适用于基于数字的属性,例如 TCP_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNT。看起来基于布尔值的开/关属性设置为SOL_SOCKET 级别。慢慢地更好地理解这一点。
  • 我建议SOL_SOCKET 用于SO_* 选项,IPPROTO_TCP 用于TCP_* 选项。

标签: linux sockets tcp boost-asio tcp-keepalive


【解决方案1】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 2014-02-26
    • 2011-09-02
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    相关资源
    最近更新 更多