linux ip_tos,getsockopt返回setsockopt中设置的不同IP_TOS值

我正在尝试使用setsockopt将IPTOS值设置为IPTOS_THROUGHPUT. setsockopt调用返回0.但是,getsockopt显示IP_TOS值设置为1,这与IPTOS_THROUGHPUT(0x8)不同.有谁知道什么可能导致setsockopt和getsockopt中的IPTOS值不匹配?

这是日志输出:

Set DSCP Marking on socket 26

setsockopt on socket 26 to 8 returns 0

DSCP marking on socket 26 is 1, different from expected 8

以下是代码:

int iptos = IPTOS_THROUGHPUT;

log(debug, 10, "Set DSCP Marking on socket %d\n", sockfd);

retval = setsockopt(sockfd, IPPROTO_TCP, IP_TOS, &iptos, sizeof(iptos));

if (retval<0) {

log(error, 99, "Failed to set DSCP marking on socket %d with error %d\n",

sockfd, retval);

} else {

log(debug, 10, "setsockopt on socket %d to %d returns %d\n", sockfd, iptos,

retval);

int tos=0;

socklen_t toslen=sizeof(tos);

retval = getsockopt(sockfd, IPPROTO_TCP, IP_TOS, &tos, &toslen);

if(retval<0) {

log(warning, 99, "Failed to get DSCP marking on socket %d with error %d\n",

sockfd, retval);

}else {

if( tos != iptos ) {

log(warning, 99, "DSCP marking on socket %d is %d, different from expected %d\n",

sockfd, tos, iptos);

retval = 9999;

}

else {

log(debug, 10, "Success: Set DSCP Marking on socket %d to %d\n",

sockfd, iptos);

retval = 0;

}

}

}

解决方法:

您应该使用级别选项IPPROTO_IP而不是IPPROTO_TCP

标签:c-3,linux,sockets,setsockopt,getsockopt

来源: https://codeday.me/bug/20190625/1287679.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个IP数据包头部的结构体定义,具体解释如下: - `struct ip_header *ip_protocol;`:定义一个名为ip_protocol的指向IP数据包头部结构体的指针。 - `u_int header_length;`:定义一个名为header_length的无符号整型变量,用于存储IP数据包头部的长度。 - `u_int offset;`:定义一个名为offset的无符号整型变量,用于存储IP数据包的偏移量。 - `u_char tos;`:定义一个名为tos的无符号字符变量,用于存储IP数据包的服务类型。 - `unsigned short checksum;`:定义一个名为checksum的无符号短整型变量,用于存储IP数据包头部的校验和。 其IP数据包头部的结构体一般包含以下字段: - 版本(version):4位,用于标识IP协议的版本号,IPv4为4,IPv6为6。 - 首部长度(header length):4位,用于指定IP数据包头部的长度(以4字节为单位)。 - 服务类型(type of service):8位,用于指定IP数据包的服务类型。 - 总长度(total length):16位,表示整个IP数据包的长度(包括IP头部和数据部分)。 - 标识(identification):16位,用于标识属于同一个数据报的分片。 - 标志(flags):3位,用于指定是否允许数据包分片以及是否是最后一片数据包。 - 片偏移(fragment offset):13位,用于指定该数据包片段在原始数据包的位置。 - 生存时间(time to live):8位,用于限制数据包在网络的生存时间,每经过一个路由器,TTL减1,当TTL为0时数据包被丢弃。 - 协议(protocol):8位,用于标识IP数据包所使用的协议,如TCP、UDP、ICMP等。 - 校验和(header checksum):16位,用于检查IP数据包头部在传输过程是否发生了变化。 - 源IP地址(source IP address):32位,用于标识数据包发送者的IP地址。 - 目的IP地址(destination IP address):32位,用于标识数据包接收者的IP地址。 在这个结构体,定义了IP头部的版本、首部长度、服务类型、总长度、片偏移、生存时间、协议和校验和等字段,其IP地址和目的IP地址可以通过另外的变量来存储。可以通过这些字段获取IP数据包的基本信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值