сбои setsockopt для IPPROTO_TCP IP_TOS в C - PullRequest
6 голосов
/ 26 мая 2011

Мой код не работает.Я работаю с правами root (такое же поведение, как у обычного пользователя)

Сначала я хочу установить TOS, а затем получить значение.

int tos_local = 0x28;
if (setsockopt(sockfd, IPPROTO_TCP, IP_TOS,  &tos_local, sizeof(tos_local))) {
    error("error at socket option");
} else {
    int tos=0;
    int toslen=0;

    if (getsockopt(sockfd, IPPROTO_TCP, IP_TOS,  &tos, &toslen) < 0) {
            error("error to get option");
    }else {
            printf ("changing tos opt = %d\n",tos);
    }
}

printf печатает

с изменением tots opt = 0

Я ожидал бы напечатать 0x28 (40).

В чем проблема?

Правильный ответ:

    if (setsockopt(sockfd, **IPPROTO_IP**, IP_TOS,  &tos_local, sizeof(tos_local))) {

    int tos=0;
    int toslen=sizeof(tos); //that line here

    if (getsockopt(sockfd, IPPROTO_IP, IP_TOS,  &tos, &toslen) < 0) {

Ответы [ 2 ]

6 голосов
/ 26 мая 2011

IP_TOS имеет уровень IPPROTO_IP, а не IPPROTO_TCP.

См. документацию .

Это влияет как на настройку, так и на получение опции.

Кроме того, что сказал Сет об инициализации параметра длины, который влияет только на getsockopt.

3 голосов
/ 26 мая 2011

При вызове getsockopt вы передаете размер памяти, на который указывает & tos. Другими словами, инициализируйте toslen в sizeof (tos).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...