首页 > 解决方案 > 使用 Python 发送 UDP 数据报

问题描述

我想使用套接字 API 通过 udp 发送数据请求。请求的格式如下:

ID | Data_Length | Data

该请求包含以下参数:标识符(ID),(Data_Length)是(Data)的大小,(Data)是要发送的数据,(Data)具有可变大小。

我写的代码如下:

def send_request():
    request_format="bbs" # 1 Byte for the ID 1 Byte for Data_Length and s for data
    data_buff=np.array([1,2,3,4,5,6,7,8,9]) # Data to be sent
    msg = struct.pack(request_format,0x01,0x09,data_buff.tobytes())
    print("msg = ", msg)
    s0.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    s0.sendto(msg, (UDP_BC_IP, UDP_SERVER_PORT))    

我的问题:

1-使用 Wireshark 我可以看到只发送了第一个数据字节,为什么?在此处输入图像描述

2-打印指令的输出是msg = b'\x01\t\x01'为什么我得到这个输出,我在等待类似的东西[0x01,0x09,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09]

标签: pythonnumpysocketsstruct

解决方案


检查dtype-data_buff除非int64你使用:

data_buff = np.array([1,2,3,4,5,6,7,8,9], dtype=np.uint8)

s然后根据数组的大小重复你的说明符:

request_format="bb" + str(data_buff.size) + "s"

现在您可以打包:

msg = struct.pack(request_format,0x01,0x09,data_buff.tobytes())

您的消息将如下所示:

b'\x01\t\x01\x02\x03\x04\x05\x06\x07\x08\t'

TAB 字符是 ASCII 代码 9,因此您将看到\t数据在哪里 9。


推荐阅读