init
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
package at_common
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
)
|
||||
|
||||
const (
|
||||
nONE = iota
|
||||
TUNNEL_PROTOCOL_TCP
|
||||
TUNNEL_PROTOCOL_UDP
|
||||
CSTYPE_SERVER
|
||||
CSTYPE_CLIENT
|
||||
MSG_CLIENT_OPEN_CONNECTION
|
||||
MSG_SERVER_OPEN_PORT
|
||||
MSG_SERVER_CLOSE_PORT
|
||||
MSG_SERVER_STATUS_PORT
|
||||
MSG_RESPONSE
|
||||
STATUS_SUCCESS
|
||||
STATUS_FAIL
|
||||
MSG_TYPE_LOGIN
|
||||
MSG_TYPE_PING
|
||||
MSG_TYPE_PONG
|
||||
CS_CLIENT uint8 = 1
|
||||
CS_SERVER uint8 = 2
|
||||
)
|
||||
|
||||
type MsgPing struct {
|
||||
Msg
|
||||
ID string
|
||||
}
|
||||
type MsgPong struct {
|
||||
Msg
|
||||
ID string
|
||||
}
|
||||
|
||||
type MsgClientOpenConnection struct {
|
||||
Msg
|
||||
TunnelID uint64
|
||||
ConnectinID uint64
|
||||
LocalHost string
|
||||
LocalPort int
|
||||
Protocol int
|
||||
}
|
||||
|
||||
type MsgServerOpenPort struct {
|
||||
Msg
|
||||
TunnelID uint64
|
||||
BindPort int
|
||||
BindIP string
|
||||
Protocol int
|
||||
}
|
||||
|
||||
func (m *MsgServerOpenPort) ProtocolString() string {
|
||||
return GetProtocolString(m.Protocol)
|
||||
}
|
||||
|
||||
type MsgServerClosePort struct {
|
||||
Msg
|
||||
TunnelID uint64
|
||||
Protocol int
|
||||
}
|
||||
type MsgServerStatusPort struct {
|
||||
Msg
|
||||
TunnelID uint64
|
||||
Protocol int
|
||||
}
|
||||
type MsgLogin struct {
|
||||
Msg
|
||||
Token string
|
||||
CSType int
|
||||
}
|
||||
|
||||
func (m *MsgLogin) IsServer() bool {
|
||||
return m.CSType == CSTYPE_SERVER
|
||||
}
|
||||
func (m *MsgLogin) IsClient() bool {
|
||||
return m.CSType == CSTYPE_CLIENT
|
||||
}
|
||||
func (m *MsgLogin) CSTypeString() string {
|
||||
return GetCSTypeString(m.CSType)
|
||||
}
|
||||
|
||||
type MsgResponse struct {
|
||||
Msg
|
||||
Status int
|
||||
Message string
|
||||
}
|
||||
|
||||
func (m *MsgResponse) IsSuccess() bool {
|
||||
return m.Status == STATUS_SUCCESS
|
||||
}
|
||||
|
||||
func Encode(data interface{}) (msg []byte, err error) {
|
||||
var message []byte
|
||||
message, err = json.Marshal(data)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
// 读取消息的长度
|
||||
var length int32 = int32(len(message))
|
||||
var pkg *bytes.Buffer = new(bytes.Buffer)
|
||||
// 写入消息头
|
||||
err = binary.Write(pkg, binary.LittleEndian, length)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
// 写入消息实体
|
||||
err = binary.Write(pkg, binary.LittleEndian, message)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
return pkg.Bytes(), nil
|
||||
}
|
||||
|
||||
func Decode(reader *bufio.Reader) (msg message, err error) {
|
||||
// 读取消息的长度
|
||||
lengthByte, _ := reader.Peek(4)
|
||||
lengthBuff := bytes.NewBuffer(lengthByte)
|
||||
var length int32
|
||||
err = binary.Read(lengthBuff, binary.LittleEndian, &length)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if int32(reader.Buffered()) < length+4 {
|
||||
err = errors.New("data length error")
|
||||
return
|
||||
}
|
||||
// 读取消息真正的内容
|
||||
pack := make([]byte, int(4+length))
|
||||
_, err = reader.Read(pack)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var _msg message
|
||||
err = json.Unmarshal(pack[4:], &_msg)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
return _msg, nil
|
||||
}
|
||||
func GetCSTypeString(cstype int) string {
|
||||
switch cstype {
|
||||
case CSTYPE_CLIENT:
|
||||
return "CLIENT"
|
||||
case CSTYPE_SERVER:
|
||||
return "SERVER"
|
||||
}
|
||||
return "UNKONWN_CSTYPE"
|
||||
}
|
||||
func GetProtocolString(protocol int) string {
|
||||
switch protocol {
|
||||
case TUNNEL_PROTOCOL_UDP:
|
||||
return "udp"
|
||||
case TUNNEL_PROTOCOL_TCP:
|
||||
return "tcp"
|
||||
}
|
||||
return "UNKONWN_PROTOCOL"
|
||||
}
|
||||
Reference in New Issue
Block a user