我正在尝试实现自定义UDP协议。该协议有标题和数据。标题包含有关数据结构的信息。
标题使用ctypes结构定义,数据使用' h'数组(签名简称)。
我正在使用python套接字。
我尝试使用单独调用" socket.sendto"来发送标头和数据。像这样:
s.sendto(header, addr)
s.sendto(data, addr)
但我无法将其作为连续流接收。 " socket.recvfrom"只是获取标题。也许如果我打电话给" socket.recvfrom"我也将获得数据。但这不是我需要的。我需要完整的数据包作为流。我认为连接服务器本身的头和数据可能会解决这个问题。
所以我尝试了以下不同的组合来连接两者:
以上所有因上述原因而失败。
如果我需要转换标题或数据,我希望它是标题,因为它更小。但如果没有办法,我可以转换数据。
感谢任何帮助。
相关代码段:
sdata = array("h")
.
.
.
header=protocol.HEADER(1,50,1,50,1,50,1,50,1,10,1,12,1,1,1,1,1,18,19,10,35,60,85,24,25)
.
.
s.sendto(header+sdata, addr)
答案 0 :(得分:1)
您可以将标头结构复制到ctypes
字节数组中:
>>> buf = (ctypes.c_char * ctypes.sizeof(header)).from_buffer_copy(header)
现在,在Python 2中,
>>> buf.raw + sdata.tostring()
应该给你你想要的东西。
在Python 3中,它将是
>>> buf.raw + sdata.tobytes()