xid := os.Getpid()&0xffff
有人知道这里&0xffff起什么作用吗?
我在许大的《go语言编程》第5章看到的icmp的例子
不知道这几句是什么意思,起什么作用的
sum = (sum >> 16) + (sum & 0xffff)
sum += (sum >> 16)
var answer uint16 = uint16(^sum)
原方法
func checkSum(msg []byte) uint16 {
sum := 0
for n := 1; n < len(msg)-1; n += 2 {
sum += int(msg[n])*256 + int(msg[n+1])
}
sum = (sum >> 16) + (sum & 0xffff)
sum += (sum >> 16)
var answer uint16 = uint16(^sum)
return answer
}
PID一般是16位(也可以改 pid_max),
os.Getpid()&0xffff
只取Pid低16位。RAW Socket Packet在header中需要一个唯一ID,通常就用当前进程的PID,但这个
id
要求是unsigned short(16 bit),所以就取os.Getpid()&0xffff
。后面一个checkSum函数是一种常见的 Internet checksum算法。
实际上,上面的代码和前面for循环将msg每一个byte相加是差不多一回事。相当于对sum这个int数据再进行一次简单的check sum。
其实更简单的写法是:
参考: