如何使用这些规则实现自定义二进制协议?
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中的函数
我正在尝试将二进制数据发送到服务器,服务器会返回响应。对于熟悉 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中的函数