Files
OmniSocketGo/cmd/internal/transport/kcp_packet_metadata.go
2026-03-27 23:03:00 +08:00

65 lines
1.4 KiB
Go

package transport
import "encoding/binary"
const kcpPacketHeaderSize = 24
func parseKCPPacketMetadata(packet []byte) (*uint32, []KCPPacketDebugSegment) {
conv := parseKCPConversationID(packet)
segments, ok := parseKCPPacketSegments(packet)
if !ok {
return conv, nil
}
return conv, segments
}
func parseKCPConversationID(packet []byte) *uint32 {
if len(packet) < 4 {
return nil
}
conv := binary.LittleEndian.Uint32(packet[:4])
return &conv
}
// ParseKCPConversationID 从原始 KCP UDP datagram 中提取 conv ID。
func ParseKCPConversationID(packet []byte) (uint32, bool) {
conv := parseKCPConversationID(packet)
if conv == nil {
return 0, false
}
return *conv, true
}
func parseKCPPacketSegments(packet []byte) ([]KCPPacketDebugSegment, bool) {
if len(packet) == 0 {
return nil, false
}
data := packet
segments := make([]KCPPacketDebugSegment, 0, 1)
for len(data) > 0 {
if len(data) < kcpPacketHeaderSize {
return nil, false
}
segmentLen := binary.LittleEndian.Uint32(data[20:])
totalLen := kcpPacketHeaderSize + int(segmentLen)
if len(data) < totalLen {
return nil, false
}
segments = append(segments, KCPPacketDebugSegment{
Cmd: data[4],
Frg: data[5],
Wnd: binary.LittleEndian.Uint16(data[6:8]),
SN: binary.LittleEndian.Uint32(data[12:16]),
UNA: binary.LittleEndian.Uint32(data[16:20]),
Len: segmentLen,
})
data = data[totalLen:]
}
return segments, true
}