示例#1
0
文件: krpc-msgs.go 项目: hlandau/dht
func (n *krNodesIPv6) UnmarshalBencode(b []byte) error {
	var bb []byte
	err := bencode.DecodeBytes(b, &bb)
	if err != nil {
		return err
	}

	if len(bb)%38 != 0 {
		return fmt.Errorf("not divisible by 38")
	}

	*n = nil
	for len(bb) > 0 {
		nodeID := NodeID(bb[0:20])
		ip := net.IP(bb[20:36])
		port := binary.BigEndian.Uint16(bb[36:38])

		*n = append(*n, NodeLocator{
			NodeID: nodeID,
			Addr: net.UDPAddr{
				IP:   ip,
				Port: int(port),
			},
		})

		bb = bb[38:]
	}

	return nil
}
示例#2
0
文件: krpc.go 项目: hlandau/dht
func decodeByType(b bencode.RawMessage, valueType reflect.Type) (interface{}, error) {
	if valueType != nil {
		v := reflect.New(valueType).Interface()
		err := bencode.DecodeBytes([]byte(b), v)
		if err != nil {
			return nil, err
		}

		return v, nil
	}

	var generic interface{}
	err := bencode.DecodeBytes([]byte(b), &generic)
	if err != nil {
		return nil, err
	}

	return generic, nil
}
示例#3
0
文件: krpc.go 项目: hlandau/dht
func Decode(b []byte) (msg *Message, err error) {
	err = bencode.DecodeBytes(b, &msg)
	if err != nil {
		log.Debugf("decode error: %x", b)
		return
	}

	if msg.Type == "q" {
		msg.Args, err = decodeByType(msg.Args_, queryTypes[msg.Method])
	}
	// msg.Type == "r": Must decode later using ResponseAsMethod.

	return
}
示例#4
0
文件: endpoint.go 项目: hlandau/dht
func (n *Endpoint) UnmarshalBencode(b []byte) error {
	var bb []byte
	err := bencode.DecodeBytes(b, &bb)
	if err != nil {
		return err
	}

	if len(bb) != 6 && len(bb) != 18 {
		return fmt.Errorf("endpoint not 6 or 18 bytes in length")
	}

	ip := net.IP(bb[0 : len(bb)-2])
	port := binary.BigEndian.Uint16(bb[len(bb)-2:])

	*n = Endpoint{
		IP:   ip,
		Port: int(port),
	}

	return nil
}