我的代码失败了。我以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) {
答案 0 :(得分:6)
IP_TOS
的级别为IPPROTO_IP
,而不是IPPROTO_TCP
。
这会影响设置和获取选项。
此外,Seth所说的初始化长度参数,仅影响getsockopt
。
答案 1 :(得分:3)
调用getsockopt时,传入&amp; tos指向的内存大小。换句话说,将toslen初始化为sizeof(tos)。