完成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

139
protocol/x224.go Normal file
View File

@@ -0,0 +1,139 @@
package protocol
import (
"bytes"
"encoding/binary"
"errors"
"io"
)
/* 协议常量 */
// X224消息头部长度
const (
X224_HEADER_LENGTH = 0x07
)
// X224消息类型字段标识
const (
X224_CONNECTION_REQUEST byte = 0xE0
X224_CONNECTION_CONFIRM byte = 0xD0
X224_DISCONNECT_REQUEST byte = 0x80
X224_DATA byte = 0xF0
X224_ERROR byte = 0x70
)
// X224 协议封装
type X224 struct {
transport *TPKT
reqProtocol uint32
selProtocol uint32
}
type X224PDU struct {
Len uint8
Type byte
DstRef uint16 // 大端序
SrcRef uint16 // 大端序
ClsOpt uint8
Payload []byte
}
func NewX224(conn io.ReadWriter) *X224 {
return &X224{
transport: NewTPKT(conn),
}
}
// 从字节流中解析PDU头部
func (x *X224) parsePDUHeader(reader *bytes.Reader, pdu *X224PDU) error {
var err error
// 读取Len字段
err = binary.Read(reader, binary.BigEndian, &pdu.Len)
if err != nil {
return errors.New("[X224] failed to read pdu length: " + err.Error())
}
// 读取Type字段
err = binary.Read(reader, binary.BigEndian, &pdu.Type)
if err != nil {
return errors.New("[X224] failed to read pdu type: " + err.Error())
}
// 读取DstRef大端序
err = binary.Read(reader, binary.BigEndian, &pdu.DstRef)
if err != nil {
return errors.New("[X224] failed to read pdu dstref: " + err.Error())
}
// 读取SrcRef大端序
err = binary.Read(reader, binary.BigEndian, &pdu.SrcRef)
if err != nil {
return errors.New("[X224] failed to read pdu srcref: " + err.Error())
}
// 读取ClsOpt
err = binary.Read(reader, binary.BigEndian, &pdu.ClsOpt)
if err != nil {
return errors.New("[X224] failed to read pdu clsopt: " + err.Error())
}
return nil
}
// 序列化X224PDU
func (x *X224) serializeX224PDU(pdu *X224PDU) []byte {
buff := bytes.NewBuffer(nil)
_ = binary.Write(buff, binary.BigEndian, pdu.Len)
_ = binary.Write(buff, binary.BigEndian, pdu.Type)
_ = binary.Write(buff, binary.BigEndian, pdu.DstRef)
_ = binary.Write(buff, binary.BigEndian, pdu.SrcRef)
_ = binary.Write(buff, binary.BigEndian, pdu.ClsOpt)
buff.Write(pdu.Payload)
return buff.Bytes()
}
// 封包
func (x *X224) Write(payload []byte) error {
pdu := &X224PDU{
Len: uint8(X224_HEADER_LENGTH + len(payload)), // 头部长度 + 载荷字段
Type: X224_DATA,
DstRef: 0xf0,
SrcRef: 0xf1,
ClsOpt: 0x0,
Payload: payload,
}
payloadBytes := x.serializeX224PDU(pdu)
err := x.transport.Write(payloadBytes)
if err != nil {
return errors.New("[X224] failed to write: " + err.Error())
}
return nil
}
// 解包
func (x *X224) Read() ([]byte, error) {
packet, err := x.transport.Read()
if err != nil {
return nil, errors.New("[X224] failed to read: " + err.Error())
}
pdu := &X224PDU{}
reader := bytes.NewReader(packet)
err = x.parsePDUHeader(reader, pdu)
if err != nil {
return nil, errors.New("[X224] failed to parse pdu header: " + err.Error())
}
payload, err := io.ReadAll(reader)
if err != nil {
return nil, errors.New("[X224] failed to read payload: " + err.Error())
}
return payload, nil
}