假设我们定义了一个用户级TCP数据包解析协议,如下所示:
A User-Level TCP Packet:
---------- ------ ---------- ----------------------------
| F1F2F3F4 | Type | Length | Packet Body |
---------- ------ ---------- ----------------------------
1. F1F2F3F4: beginning of a packet, hex data (4 bytes)
2. Type: denotes what type of this packet (2 bytes)
3. Length: how many bytes the packet contains except F1F2F3F4
Packets may have different length (2 bytes)
4. PacketBody: Real data a packet contains
假设我们有一个TCP通信对,它通过以这种格式发送数据包来相互交换数据。通信器通过套接字一次发送大量数据包,有时甚至以这种方式发送文件。
在C / C ++语言中,我会分配一个足够大的缓冲区来存储从套接字读取的数据,而不是扫描缓冲区中的 F1F2F3F4 并找到长度字段, 如果数据小于长度,则等待更多。
现在我需要在Python中实现这个,有谁知道如何做到这一点?
答案 0 :(得分:0)
看起来像这样:
import struct
def recv_full(sock, cnt):
buf = []
while cnt>0:
data = sock.recv(min(10240, cnt))
buf.append(data)
cnt -= len(data)
return ''.join(buf)
def recv_packet(sock):
header, type, length = struct.unpack('>IHH', recv_full(sock, 8))
assert header == 0xf1f2f3f4
return type, recv_full(length - 4)
答案 1 :(得分:0)
我会建议这样的事情
import struct
hdr = sock.recv(8, socket.MSG_WAITALL)
(beg, typ, pktlen) = struct.unpack('!IHH', hdr)
if beg == 0xF1F2F3F4:
body = sock.recv(pktlen, socket.MSG_WAITALL)
else:
# not expected pkt beginning