You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.2 KiB
46 lines
1.2 KiB
8 months ago
|
package parser
|
||
|
|
||
|
import (
|
||
|
"encoding/binary"
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
type UDP struct {
|
||
|
BaseLayer
|
||
|
SrcPort, DstPort uint16 // 源端口(可选)、目标端口
|
||
|
Length uint16 // 数据包总长(header+payload)
|
||
|
Checksum uint16 // 校验和(ipv4下可选)
|
||
|
}
|
||
|
|
||
|
func (U *UDP) LayerType() int {
|
||
|
return LayerTypeUDP
|
||
|
}
|
||
|
|
||
|
func DecodeUDP(data []byte) (*UDP, error) {
|
||
|
if len(data) < 8 {
|
||
|
return nil, fmt.Errorf("[UDP] 无效数据包长度: %d bytes, 至少需要8 bytes", len(data))
|
||
|
}
|
||
|
|
||
|
udp := UDP{}
|
||
|
udp.SrcPort = binary.BigEndian.Uint16(data[0:2])
|
||
|
udp.DstPort = binary.BigEndian.Uint16(data[2:4])
|
||
|
udp.Length = binary.BigEndian.Uint16(data[4:6])
|
||
|
udp.Checksum = binary.BigEndian.Uint16(data[6:8])
|
||
|
udp.Header = data[:8]
|
||
|
|
||
|
switch {
|
||
|
case udp.Length >= 8:
|
||
|
hlen := int(udp.Length)
|
||
|
if hlen > len(data) {
|
||
|
hlen = len(data)
|
||
|
}
|
||
|
udp.Payload = data[8:hlen]
|
||
|
case udp.Length == 0: // IPv6 Jumbogram, 剩下的所有数据都认为是payload
|
||
|
udp.Payload = data[8:]
|
||
|
default:
|
||
|
return nil, fmt.Errorf("[UDP] 数据包太小:%d bytes", udp.Length)
|
||
|
}
|
||
|
|
||
|
return &udp, nil
|
||
|
}
|