2015-08-05 6 views
2

Я пытаюсь проверить, что моя настройка TCP_NODELAY работает, читая ее после того, как я ее установил.Чтение TCP_NODELAY с использованием getsockopt, возвращающего странное значение

Im устанавливает значение в '1', но когда я его прочитаю, его значение устанавливается на '4'. Я боюсь, что я что-то сделаю неправильно.

Heres мой код:

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

И 'res == 0' после каждого звонка? – trojanfoe

+0

Да, res всегда 0 – Mash

ответ

3

Это нормально. Единственное, что важно, это то, что флаг равен нулю или не равен нулю. Я уверен, что ios (что вы отметили вопрос) будет вести себя более или менее как старый код Дарвина и от чтения, что я вижу, что при настройке этого параметра ядро ​​заботится только о том, равен ли он нулю или нет, но при чтении это используется фактическое значение внутреннего флага.

Если у вас есть файлы ядра вы можете найти соответствующий флаг в netinet/tcp_var.h (это ядро ​​включает файл, поэтому не включайте его сами), и это называется TF_NODELAY и случается иметь значение 4.

+0

Источник Mach находится на github, чтобы вы могли предоставить ссылку? – trojanfoe

+0

Интересно! Большое спасибо за ваш комментарий. Я могу спать сейчас :) – Mash

 Смежные вопросы

  • Нет связанных вопросов^_^