fix: kcp 协议内部日志细节
This commit is contained in:
55
cmd/internal/transport/kcp_packet_metadata.go
Normal file
55
cmd/internal/transport/kcp_packet_metadata.go
Normal file
@@ -0,0 +1,55 @@
|
||||
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
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user