当前位置: 代码迷 >> python >> 代表UDP包的Pythonic方法
  详细解决方案

代表UDP包的Pythonic方法

热度:98   发布时间:2023-07-16 11:02:33.0

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

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

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

有谁知道适合这种任务的图书馆?

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

  • ...等

现在,如果您要创建自定义数据包,则有两种方法可以使用创建新的自定义协议,也可以使用和 :

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标头( 未经测试 )的低级,简单且尽可能少的示例表示:


尽管要在复杂的协议中使用现实世界中的场景可能有点困难,因为要成为一个完整的数据包解码器,它需要进行大量的技术工作,错误处理等。

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