用于表示UDP包的Pythonic方式

时间:2018-02-12 11:52:47

标签: python python-3.x udp bitstring

我正在寻找一种pythonic方式来表示一个UDP包,该包由不同长度的字段组成。

我看到了bitstring,但定义所有字段及其长度的过程非常繁琐。我可能需要创建一个类并为每个字段和长度创建一个变量,并检查它们是否被大数字覆盖等等。

对我而言,这听起来像图书馆的工作,但我找不到。

有没有人知道这个适合这项任务的图书馆?

2 个答案:

答案 0 :(得分:1)

第一种方法是使用"电池包括" -module,如:

现在,如果您想创建自定义数据包,可以采用两种方法 使用scapy创建新的自定义协议,或者您可以使用ctypesstruct,如下所示:

import os
import struct
from ctypes import *

class myUDP(Structure):
    _fields_ = [
        ("sport",  c_ushort),
        ("dport",  c_ushort),
        ("sum",    c_ushort),
        ("len",    c_ushort)
    ]

    def __new__(self, packet=None):
        return self.from_buffer_copy(packet)

    def __init__(self, packet=None):
        # unpack your data, etc...
        self.srcport  = struct.unpack("H",self.sport)

以上是UDP标头(未经测试的)的低级,简单且尽可能少的示例表示:

UDP header

虽然在实际场景中使用复杂的协议有点困难,因为它需要大量的技术工作,错误处理等......才能成为一个完整的数据包解码器。

答案 1 :(得分:0)

您可以使用scapy进行数据包操作

from scapy.all import *
packet = IP(src="1.1.1.1", dst="2.2.2.2")/UDP(dport=4321, sport=123)/"payload"
print str(packet)
# output: 'E\x00\x00#\x00\x01\x00\x00@\x11t\xc4\x01\x01\x01\x01\x02\x02\x02\x02\x00{\x10\xe1\x00\x0f+?payload'