使用getsockopt读取TCP_NODELAY返回一个奇怪的值

时间:2015-08-05 13:31:21

标签: c++ ios c sockets raw-sockets

我正在尝试通过在设置后将其读回来验证我的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'。这看起来很奇怪。

我做错了吗?

1 个答案:

答案 0 :(得分:3)

这没关系。唯一相关的是标志为零或非零。我非常确定ios(你标记了这个问题)的行为或多或少会像旧的Darwin代码一样,从阅读中我可以看到,在设置选项时,内核只关心它是否&# 39; s为零或不是,但在读取时,使用实际的内部标志值。

如果你有内核包含文件,你可以在netinet / tcp_var.h中找到相关的标志(这是内核包含文件,所以不要自己包含它),它被称为TF_NODELAY并且恰好具有值4。