linux IPPROTO_TCP或SOL_套接字

5hcedyr0  于 2022-12-11  发布在  Linux
关注(0)|答案(2)|浏览(609)

我在一个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连接。

tf7tbtn2

tf7tbtn21#

SOL是socket_level的缩写,它是为SO_*选项设计的,例如SO_REUSEPORT
IPPROTO_*是为特定网络协议(如IPPROTO_IP、IPPROTO_TCP)的选项而设计的
更多信息:

pieyvz9o

pieyvz9o2#

这里一位IBM文档说:
level是为其设置套接字选项的协议级别。支持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
这里也是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

相关问题