完成TPKT、X224、FastPath协议基本封装和测试

This commit is contained in:
2025-03-31 14:10:03 +08:00
parent 7c2bbde75b
commit 6720895668
9 changed files with 608 additions and 0 deletions

91
protocol/tpkt.go Normal file
View File

@@ -0,0 +1,91 @@
package protocol
import (
"encoding/binary"
"errors"
"io"
)
/*
定义协议相关的常量值
*/
const (
TPKT_VERSION = 0x03
TPKT_RESERVED = 0x00
TPKT_HEADER_LENGTH = 0x04
TPKT_MAX_PACKET_LENGTH = 0xffff
)
/*
TPKT结构体封装
*/
type TPKT struct {
conn io.ReadWriter
}
func NewTPKT(conn io.ReadWriter) *TPKT {
return &TPKT{
conn: conn,
}
}
/*
TPKT封包
*/
func (t *TPKT) Write(payload []byte) error {
pduLength := TPKT_HEADER_LENGTH + len(payload)
if pduLength > TPKT_MAX_PACKET_LENGTH {
return errors.New("[TPKT] packet length too long")
}
// 构造TPKT头4 bytes
pdu := make([]byte, pduLength)
pdu[0] = TPKT_VERSION
pdu[1] = TPKT_RESERVED
binary.BigEndian.PutUint16(pdu[2:4], uint16(pduLength))
// 装入TPKT载荷
copy(pdu[4:], payload)
_, err := t.conn.Write(pdu)
if err != nil {
return errors.New("[TPKT] write error: " + err.Error())
}
return nil
}
/*
TPKT解包
*/
func (t *TPKT) Read() ([]byte, error) {
// 验证TPKT头
pduHeader := make([]byte, TPKT_HEADER_LENGTH)
_, err := io.ReadFull(t.conn, pduHeader)
if err != nil {
return nil, errors.New("[TPKT] read pdu header error: " + err.Error())
}
if pduHeader[0] != TPKT_VERSION {
return nil, errors.New("[TPKT] version mismatch")
}
pduLength := binary.BigEndian.Uint16(pduHeader[2:4])
if pduLength > TPKT_MAX_PACKET_LENGTH {
return nil, errors.New("[TPKT] packet length too long")
}
// 读取TPKT载荷
payloadLength := pduLength - TPKT_HEADER_LENGTH
payload := make([]byte, payloadLength)
_, err = io.ReadFull(t.conn, payload)
if err != nil {
return nil, errors.New("[TPKT] read pdu payload error: " + err.Error())
}
return payload, nil
}