使用 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.