如何使用Python解析TCP流包含自定义协议数据包

时间:2014-11-15 11:54:17

标签: python linux sockets networking tcp

假设我们定义了一个用户级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中实现这个,有谁知道如何做到这一点?

2 个答案:

答案 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