IPV6_CHECKSUM套接口选项
对于ICMPv6原始套接口,内核总是计算并存储ICMPv6头部中的校验和。尽管ICMPv4和ICMPv6都要求发送者计算校验和,ICMPv6却在起校验和中包括一个伪头部。该伪头部中的字段之一是源IPv6地址,而应用程序通常让内核选择其值。
对于其他IPv6原始套接口(不是以IPPROTO_ICMPV6为第3个参数调用socket创建的那些原始套接口),进程可以使用一个套接口选项告知内核是否计算并存储外出分组中的校验和,且验证接收分组中的校验和。该选项缺省情况下是禁止的,不过把它的值设置为某个非负值就可以开启该选项,例如如下代码:
int offset = 2;
if(setsockopt(sockfd,IPPROTO_IPV6,IPV6_CHECKSUM,&offset,sizeof(offset)) < 0)
{
出错处理
};
这段代码不仅开启指定套接口上的校验和,而且告知内核这个16位的校验和字段的字节偏移量:本例中为自应用数据开始处起偏移2个字节。禁止该选项要求把这个偏移量设置为-1.一旦开启,内核将为在指定套接口上发送的外出分组计算并存储校验和,并且为该套接口接收的外来分组验证校验和。