如何使用Python解析由CustomProtocol包组成的TCP流

2024-09-30 22:10:13 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们定义了一个用户级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++语言中,我将分配一个足够大的缓冲区来存储从socket读取的数据,而不是在缓冲区中扫描<强> f1f2f3f4>强>,找到<强>长度< /强>字段, 如果数据小于长度,则等待更多。在

现在我需要用Python实现这个,有人知道怎么做吗?在


Tags: of数据用户databytes定义packettype
2条回答

我建议这样做

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

看起来像这样:

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)

相关问题 更多 >