IPPROTO_TCP 或 SOL_SOCKET

Gam*_*ads 1 sockets linux tcp boost-asio tcp-keepalive

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

KEEP_ALIVE TCP expamples使用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))
Run Code Online (Sandbox Code Playgroud)

或者

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))
Run Code Online (Sandbox Code Playgroud)

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

Jia*_*Liu 5

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

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

更多的: