IPPROTO_TCP or SOL_SOCKET



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

tcp keep_aliveexpamps 使用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连接。

SOL是socket_level的缩写,专为SO_*选项而设计,例如SO_REUSEPORT

IPPROTO_*专为特定网络协议的选项而设计,例如 IPPROTO_IP、IPPROTO_TCP

更多:

  • https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html#Socket_002dLevel-Options
  • https://www.gnu.org/software/guile/manual/html_node/Network-Sockets-and-Communication.html
  • https://linux.die.net/man/2/getsockopt
  • https://linux.die.net/man/7/tcp

这里的IBM文档说:

水平 是为其设置套接字选项的协议级别。 支持SOL_SOCKETIPPROTO_TCP
所有以"SO_"开头的 optname 值都用于协议级别SOL_SOCKET,并由常规套接字代码解释。
所有以"TCP_"开头的 optname 值都用于协议级别IPPROTO_TCP,并由 TCP/IP 内部代码解释。

但我不确定它是否也适用于 linux。

https://www.ibm.com/docs/en/zvm/7.1?topic=functions-setsockopt

<小时 />

TCP_*选项
https://man7.org/linux/man-pages/man7/tcp.7.html#:~:text=set%20to-,IPPROTO_TCP

SO_* 选项
https://man7.org/linux/man-pages/man7/socket.7.html#:~:text=level%20set%20to-,SOL_SOCKET

注意:使用chrome可以滚动以突出显示手册页中的关键字。



这里也是一个SOL_TCP,似乎和IPPROTO_TCP一样

$ ag 'SOL_SOCKET|SOL_TCP|IPPROTO_TCP' -R /usr/include/ --file-search-regex .h
/usr/include/netinet/tcp.h
206:# define SOL_TCP        6   /* TCP level */
/usr/include/netinet/in.h
50:    IPPROTO_TCP = 6,    /* Transmission Control Protocol.  */
51:#define IPPROTO_TCP      IPPROTO_TCP
/usr/include/linux/in.h
37:  IPPROTO_TCP = 6,       /* Transmission Control Protocol    */
38:#define IPPROTO_TCP      IPPROTO_TCP

/usr/include/asm-generic/socket.h
9:#define SOL_SOCKET    1
/usr/include/x86_64-linux-gnu/bits/socket-constants.h
25:#define SOL_SOCKET 1

相关内容

  • 没有找到相关文章

最新更新