如何使用这些规则实现自定义二进制协议?

How to implement a custom binary protocol using these rules?

我正在尝试将二进制数据发送到服务器,服务器会返回响应。对于熟悉 python 的人来说,这些规则似乎是可以理解的,但我是 python 和使用 struct 进行套接字编程的新手。所以文档说明了这一点:

有一个 8 字节 header,其中有一个 32 位整数用于请求标记,一个 32 位整数用于命令。类型是 uint32。缓冲区大小取决于命令的类型。

一些命令带有参数,它们与命令消息 header 一起发送,直接在 header 之后,没有填充。参数缓冲区的大小由命令类型决定。

所以我连接到服务器,现在我尝试打包到值并像那样发送,但我不知道我这样做是否正确。

import socket
import struct

# Create a TCP/IP socket

from protlib import hexdump

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 4200)
sock.connect(server_address)

values = (23, 42)
packer = struct.Struct('i i ')
packed_data = packer.pack(*values)

# Send data
sock.sendall(packed_data)

while True:
    raw_data = sock.recv(1024)
    unpacked_data = struct.unpack('>i i', raw_data)
    print(unpacked_data)
    sock.close()

如果有人能给我指出正确的方向并提供一些指导,我会阅读更多相关内容。

好的,所以我发现了错误,并且能够通过服务器获得我想要的响应。错误是

packer = struct.Struct('i i ') // 需要像 ('!i i')

这样格式化

和 raw_data = sock.recv(1024) unpacked_data = struct.unpack('>i i', raw_data) // 需要添加!不是 > 打印(unpacked_data) sock.close()

我还写了一个简单的解包器,帮助我以正确的方式解压它

def data_unpacking(数据): 标记,代码 = struct.unpack('!ii', data[:8]) return 标签、代码、数据[8:]

然后用参数raw_data

调用main中的函数