对于C中的IPPROTO_TCP IP_TOS,setsockopt失败

时间:2011-05-26 15:56:17

标签: c linux sockets network-programming

我的代码失败了。我以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打印

  

更改tos 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 个答案:

答案 0 :(得分:6)

IP_TOS的级别为IPPROTO_IP,而不是IPPROTO_TCP

请参阅the documentation

这会影响设置和获取选项。

此外,Seth所说的初始化长度参数,仅影响getsockopt

答案 1 :(得分:3)

调用getsockopt时,传入&amp; tos指向的内存大小。换句话说,将toslen初始化为sizeof(tos)。