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