【问题标题】:Pythonic way to represent a UDP package表示 UDP 包的 Pythonic 方式
【发布时间】:2018-02-12 11:52:46
【问题描述】:

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

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

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

有谁知道这样的库适合这个任务吗?

【问题讨论】:

标签: python python-3.x udp bitstring


【解决方案1】:

第一种方法是使用“包含电池”的模块,例如:

现在如果你想创建一个自定义数据包,有两种方法是 使用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头部的一个低级、简单和尽可能少的示例表示(未测试):


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

【讨论】:

    【解决方案2】:

    您可以使用 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'
    

    【讨论】:

    • 这正是我不想这样做的方式!
    • 你只能从 scapy 中提取 UDP 类表示,就像@game0ver 建议的那样。
    猜你喜欢
    • 2016-06-05
    • 2022-11-01
    • 2010-12-20
    • 1970-01-01
    • 2012-05-08
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多