Golang - 通过TLS套接字发送二进制编码数据

时间:2016-06-04 00:12:11

标签: python sockets go binary packing

我是Golang的新手以及这种更低级别的东西,所以也许我只是在想错误的方向。

我的项目是一个小型golang监控客户端,它通过加密的TLS连接发送一些ping消息(当前日期)(这仅用于学习目的)。 python服务器和客户端现在正在完美运行。

(python)服务器&客户端正在打包这样的数据:

[...]
def _send_msg(self, msg):
    msg = struct.pack('>I', len(msg)) + bytes(msg, 'UTF-8')
    self.client.send(msg)

def _recv_msg(self):
    raw_msglen = self.client.recv(4)
    if not raw_msglen:
        return ""
    msglen = struct.unpack('>I', raw_msglen)[0]
    return self._recvall(msglen)
[...]

在Go-Side,我打包了这样的数据:

type packet struct {
   a uint32
   b []byte
}

func pack(d string) []byte {

    buf := bytes.Buffer{}
    u := len([]byte(d))
    p := packet{
        a: uint32(u),      
        b: []byte(d),
    }

    err := binary.Write(&buf, binary.BigEndian, p.a) // struct.unpack('>I' [...] in python 

    if err != nil {
       fmt.Println(err)
    }

    buf.Write(p.b) // Append bytes to buffer

    return buf.Bytes() 
}

reader := bufio.NewReader(tlsConn) // Socket reader

[..]
// Writing binary data
tlsConn.Write(pack("login test:test")) // Works so far

// Reading response (from python server)
var p uint32  // packet size
binary.Read(reader, binary.BigEndian, &p) // Read packet length (4 bytes uint32)
buf1 := make([]byte, int(p))
reader.Read(buf1)
fmt.Println(string(buf1)) // Print  response - this also works

// Send some ping
// This code part also get's passed, but the python server doesn't
// recive any message
c.Write(pack("ping 0000-00-00 00:00:00")) 
binary.Read(reader, binary.BigEndian, &p)
buf1 = make([]byte, int(p))
fmt.Println(string(buf1)) // Here i don't get an response

以下是我正在使用的golang客户端测试代码:http://pastebin.com/dr1mJZ9Y 和相应的终端输出:http://pastebin.com/mrctJPs5

奇怪的是,登录消息(包括服务器响应)都被正确发送(和接收),但第二次尝试发送ping时如下:

tlsConn.Write(pack("ping 0000-00-00 00:00:00"))

消息似乎没有到达服务器,也没有响应消息被发送回客户端。

包数据的二进制编码和长度前缀是否有错误?

我知道代码看起来有点乱,并不是非常惯用,对不起。 提前再次感谢您的帮助!

软件依赖/环境:

  • Python 3.4
  • Golang 1.5.3(amd64 Linux)
  • 没有第三方图书馆

0 个答案:

没有答案