我在一个TCP套接字上的对等端之间有一个简单的P2P连接。我的客户端和服务器都运行在 Linux 上。我在两端的TCP套接字上都打开了TCP keep_alive functionality。我使用boost::asio在两端的TCP套接字上进行连接、读写数据。
tcp keep_alive示例使用了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连接。
2条答案
按热度按时间tf7tbtn21#
SOL是socket_level的缩写,它是为
SO_*
选项设计的,例如SO_REUSEPORT
IPPROTO_*
是为特定网络协议(如IPPROTO_IP、IPPROTO_TCP)的选项而设计的更多信息:
pieyvz9o2#
这里一位IBM文档说:
level是为其设置套接字选项的协议级别。支持
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
这里也是
SOL_TCP
,看起来与IPPROTO_TCP相同