VP.*_*VP. 4 c struct network-programming go
我有一个基于 golang 的客户端,它必须使用二进制协议与 C 守护进程通信。我无法更改服务器以支持 json、xml 或其他协议。
在C代码中,我必须填写以下结构并通过网络发送:
typedef struct pkt_struct{
int16_t pkt_version;
int16_t pkt_type;
u_int32_t crc32_v;
int16_t ret_code;
char buffer[1024];
}pkt;
Run Code Online (Sandbox Code Playgroud)
要了解我如何需要数据,它应该类似于以下输出:
$ irb
2.0.0-p353 :002 > [2, 1, 0, 0, 'version', 3].pack("nnNna1024n")
Run Code Online (Sandbox Code Playgroud)
答案是 gob 吗?仔细阅读文档,发现事实并非如此。也许是 ProtoBuf?
到目前为止我所做的是:
import "encoding/binary"
....
type NPacket struct {
packet_version int16
packet_type int16
crc32_value uint32
ret_code int16
buffer string
}
....
var pkt_send NPacket
pkt_send = NPacket{2,1,0,0,"version"}
buf := new(bytes.Buffer)
if err := binary.Write(buf, binary.BigEndian, &pkt_send); err != nil {
fmt.Println(err)
os.Exit(1)
}
Run Code Online (Sandbox Code Playgroud)
我收到的错误:
binary.Write: invalid type string
Run Code Online (Sandbox Code Playgroud)
binary.Write
仅适用于固定大小的物体。字符串可以是任意大小。相反,您可能想要复制 C 代码并使用固定大小的字节数组:
type NPacket struct {
packet_version int16
packet_type int16
crc32_value uint32
ret_code int16
buffer [1024]byte
}
Run Code Online (Sandbox Code Playgroud)
您可以使用 设置缓冲区copy(pkt.buffer[:], "string")
。
gob 和 protobuf 都不是答案。它们都是编码格式,您无法控制数据的编组方式。