Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以Pythonic方式表示UDP包_Python_Python 3.x_Udp_Bitstring - Fatal编程技术网

以Pythonic方式表示UDP包

以Pythonic方式表示UDP包,python,python-3.x,udp,bitstring,Python,Python 3.x,Udp,Bitstring,我正在寻找一种pythonic方法来表示由不同长度的不同字段组成的UDP包 我看到了,但是定义所有字段及其长度的过程非常繁琐。我可能需要创建一个类,为每个字段和长度创建一个变量,并检查它们是否被较大的数字覆盖,等等 对我来说,这听起来像是图书馆的工作,但我找不到 有人知道适合此任务的库吗?您可以使用scapy进行数据包操作 from scapy.all import * packet = IP(src="1.1.1.1", dst="2.2.2.2")/UDP(dport=4321, sport

我正在寻找一种pythonic方法来表示由不同长度的不同字段组成的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'
第一种方法是使用“含电池”模块,如:

  • ……等等
现在,如果您想创建自定义数据包,有两种方法 使用创建新的自定义协议,也可以使用以下类似方法:

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



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

我不知道一个用于UDP检查的现成库。如果您自己创建,我会使用C/C++库(例如,看看boost:python),或者创建一个继承或至少使用字节对象和访问方法作为数组的类()这正是我不喜欢的方式!您只能从scapy提取UDP类表示,就像@game0ver建议的那样。
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)