|
|
@@ -13,15 +13,17 @@ import (
|
|
|
|
|
|
"git.me9.top/git/tinymq/config"
|
|
|
"git.me9.top/git/tinymq/conn"
|
|
|
- "git.me9.top/git/tinymq/conn/util"
|
|
|
+ "git.me9.top/git/tinymq/util"
|
|
|
)
|
|
|
|
|
|
const PROTO string = "tcp"
|
|
|
const VERSION uint8 = 2
|
|
|
|
|
|
-// 数据包的最大长度
|
|
|
+// 第一级数据包的最大长度,如果超过则自动增加一个地址位到4个字节
|
|
|
const MAX_LENGTH = 0xFFFF
|
|
|
-const MAX2_LENGTH = 0x1FFFFFFF // 500 M,避免申请过大内存
|
|
|
+
|
|
|
+// 由于都是内部使用,感觉没有必要加这个限制
|
|
|
+// const MAX2_LENGTH = 0x1FFFFFFF // 500 M,避免申请过大内存
|
|
|
|
|
|
type Tcp2 struct {
|
|
|
cf *config.Config
|
|
|
@@ -197,10 +199,7 @@ func Dial(cf *config.Config, addr string, hash string) (conn.Connect, error) {
|
|
|
|
|
|
// 发送数据到网络
|
|
|
// 如果有加密函数的话会直接修改源数据
|
|
|
-func (c *Tcp2) writeMessage(buf []byte) (err error) {
|
|
|
- if len(buf) > MAX2_LENGTH {
|
|
|
- return fmt.Errorf("data length more than %d", MAX2_LENGTH)
|
|
|
- }
|
|
|
+func (c *Tcp2) WriteRaw(buf []byte) (err error) {
|
|
|
if c.cipher != nil {
|
|
|
c.cipher.Encrypt(buf, buf)
|
|
|
}
|
|
|
@@ -276,11 +275,11 @@ func (c *Tcp2) WriteAuthInfo(channel string, auth []byte) (err error) {
|
|
|
index += channelLen
|
|
|
copy(buf[index:], auth)
|
|
|
buf[start+dlen] = util.CRC8(buf[start : start+dlen])
|
|
|
- return c.writeMessage(buf)
|
|
|
+ return c.WriteRaw(buf)
|
|
|
}
|
|
|
|
|
|
// 从连接中读取信息
|
|
|
-func (c *Tcp2) readMessage(deadline int) ([]byte, error) {
|
|
|
+func (c *Tcp2) ReadRaw(deadline int) ([]byte, error) {
|
|
|
buf := make([]byte, 2)
|
|
|
err := c.conn.SetReadDeadline(time.Now().Add(time.Millisecond * time.Duration(deadline)))
|
|
|
if err != nil {
|
|
|
@@ -310,7 +309,7 @@ func (c *Tcp2) readMessage(deadline int) ([]byte, error) {
|
|
|
c.cipher.Decrypt(buf, buf)
|
|
|
}
|
|
|
dlen = binary.BigEndian.Uint32(buf)
|
|
|
- if dlen < MAX_LENGTH || dlen > MAX2_LENGTH {
|
|
|
+ if dlen < MAX_LENGTH {
|
|
|
return nil, errors.New("wrong length in read message")
|
|
|
}
|
|
|
}
|
|
|
@@ -339,7 +338,7 @@ func (c *Tcp2) ReadAuthInfo() (proto string, version uint8, channel string, auth
|
|
|
return
|
|
|
}
|
|
|
}()
|
|
|
- msg, err := c.readMessage(c.cf.ReadWait)
|
|
|
+ msg, err := c.ReadRaw(c.cf.ReadWait)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
@@ -425,7 +424,7 @@ func (c *Tcp2) WriteRequest(id uint16, cmd string, data []byte) error {
|
|
|
|
|
|
copy(buf[index:], compressedData)
|
|
|
buf[start+ddlen] = util.CRC8(buf[start : start+ddlen])
|
|
|
- return c.writeMessage(buf)
|
|
|
+ return c.WriteRaw(buf)
|
|
|
} else {
|
|
|
ddlen := 2 + 1 + cmdLen + dlen
|
|
|
buf, start := c.writeDataLen(ddlen)
|
|
|
@@ -438,7 +437,7 @@ func (c *Tcp2) WriteRequest(id uint16, cmd string, data []byte) error {
|
|
|
index += cmdLen
|
|
|
copy(buf[index:], data)
|
|
|
buf[start+ddlen] = util.CRC8(buf[start : start+ddlen])
|
|
|
- return c.writeMessage(buf)
|
|
|
+ return c.WriteRaw(buf)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -469,7 +468,7 @@ func (c *Tcp2) WriteResponse(id uint16, state uint8, data []byte) error {
|
|
|
|
|
|
copy(buf[index:], compressedData)
|
|
|
buf[start+ddlen] = util.CRC8(buf[start : start+ddlen])
|
|
|
- return c.writeMessage(buf)
|
|
|
+ return c.WriteRaw(buf)
|
|
|
} else {
|
|
|
ddlen := 2 + 1 + len(data)
|
|
|
buf, start := c.writeDataLen(ddlen)
|
|
|
@@ -480,7 +479,7 @@ func (c *Tcp2) WriteResponse(id uint16, state uint8, data []byte) error {
|
|
|
index++
|
|
|
copy(buf[index:], data)
|
|
|
buf[start+ddlen] = util.CRC8(buf[start : start+ddlen])
|
|
|
- return c.writeMessage(buf)
|
|
|
+ return c.WriteRaw(buf)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -491,12 +490,12 @@ func (c *Tcp2) WritePing(id uint16) error {
|
|
|
index := start
|
|
|
binary.BigEndian.PutUint16(buf[index:index+2], id)
|
|
|
buf[start+dlen] = util.CRC8(buf[start : start+dlen])
|
|
|
- return c.writeMessage(buf)
|
|
|
+ return c.WriteRaw(buf)
|
|
|
}
|
|
|
|
|
|
// 获取信息
|
|
|
func (c *Tcp2) ReadMessage(deadline int) (msgType conn.MsgType, id uint16, cmd string, state uint8, data []byte, err error) {
|
|
|
- msg, err := c.readMessage(deadline)
|
|
|
+ msg, err := c.ReadRaw(deadline)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
@@ -539,12 +538,12 @@ func (c *Tcp2) ReadMessage(deadline int) (msgType conn.MsgType, id uint16, cmd s
|
|
|
|
|
|
// 获取远程的地址
|
|
|
func (c *Tcp2) RemoteIP() net.IP {
|
|
|
- return conn.AddrToIP(c.conn.RemoteAddr())
|
|
|
+ return util.AddrToIP(c.conn.RemoteAddr())
|
|
|
}
|
|
|
|
|
|
// 获取本地的地址
|
|
|
func (c *Tcp2) LocalIP() net.IP {
|
|
|
- return conn.AddrToIP(c.conn.LocalAddr())
|
|
|
+ return util.AddrToIP(c.conn.LocalAddr())
|
|
|
}
|
|
|
|
|
|
func (c *Tcp2) Close() error {
|