Skip to content

icmp的那个实例中checkSum貌似有问题 #17

@suhanyujie

Description

@suhanyujie
  • 书中的源代码checkSum实现如下,(位于文件https://github.com/qiniu/gobook/blob/master/chapter5/icmptest.go
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
}
  • 实际运行时,会导致代码阻塞在n, err := conn.Read(msg[0:]),运行结果和书中描述的预期不一致
  • 我去网上搜了一下其他的实现方法,大部分如下:
func checkSum(data []byte) uint16 {
	var (
		sum    uint32
		length = len(data)
		index  int
	)
	for length > 1 {
		sum += uint32(data[index])<<8 + uint32(data[index+1])
		index += 2
		length -= 2
	}
	if length > 0 {
		sum += uint32(data[index])
	}
	sum += sum >> 16
	return uint16(^sum)
}
  • 将checkSum替换成使用这种方法实现,程序是可以正常运行的,和书中描述的预期一致

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions