使用 getsockopt 读取 TCP_NODELAY 返回一个奇怪的值
Reading TCP_NODELAY using getsockopt returning a weird value
我正在尝试通过在设置后回读来验证我的 TCP_NODELAY 设置是否有效。
我将值设置为“1”,但当我读回它时,它设置为“4”。恐怕我做错了什么。
这是我的代码:
int tcpBefore;
socklen_t tcpBeforeLen = sizeof(tcpBefore);
int res = getsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &tcpBefore, &tcpBeforeLen);
// Turn on TCP no delay
int tcpNoDelay = 1;
res = setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (void *)&tcpNoDelay, sizeof(tcpNoDelay));
int tcpAfter;
socklen_t tcpAfterLen = sizeof(tcpAfter);
res = getsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &tcpAfter, &tcpAfterLen);
我为 'tcpBefore' 得到的值是“0”。设置后得到的值为“4”。这似乎很奇怪。
我做错了什么吗?
没关系。唯一相关的是标志为零或非零。我很确定 ios
(你用它标记了问题)的行为或多或少会像旧的达尔文代码,并且通过阅读我可以看到在设置选项时,内核只关心它是否为零, 但在读取时使用实际的内部标志值。
如果你有内核包含文件,你可以在 netinet/tcp_var.h 中找到相关的标志(这是内核包含文件,所以不要自己包含它)它被称为 TF_NODELAY
并且发生具有值 4.
我正在尝试通过在设置后回读来验证我的 TCP_NODELAY 设置是否有效。
我将值设置为“1”,但当我读回它时,它设置为“4”。恐怕我做错了什么。
这是我的代码:
int tcpBefore;
socklen_t tcpBeforeLen = sizeof(tcpBefore);
int res = getsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &tcpBefore, &tcpBeforeLen);
// Turn on TCP no delay
int tcpNoDelay = 1;
res = setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (void *)&tcpNoDelay, sizeof(tcpNoDelay));
int tcpAfter;
socklen_t tcpAfterLen = sizeof(tcpAfter);
res = getsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &tcpAfter, &tcpAfterLen);
我为 'tcpBefore' 得到的值是“0”。设置后得到的值为“4”。这似乎很奇怪。
我做错了什么吗?
没关系。唯一相关的是标志为零或非零。我很确定 ios
(你用它标记了问题)的行为或多或少会像旧的达尔文代码,并且通过阅读我可以看到在设置选项时,内核只关心它是否为零, 但在读取时使用实际的内部标志值。
如果你有内核包含文件,你可以在 netinet/tcp_var.h 中找到相关的标志(这是内核包含文件,所以不要自己包含它)它被称为 TF_NODELAY
并且发生具有值 4.