Pythonic способ представления пакета UDP

Я ищу питонский способ представления пакета UDP, состоящего из разных полей разной длины и так далее.

Я видел цепочку, но процесс определения всех полей и их длины довольно громоздок. Мне, вероятно, нужно создать класс и создать переменную для каждого поля и длины, а также убедиться, что они не перезаписываются большими числами и так далее.

Для меня это звучит как работа для библиотеки, но я не смог ее найти.

Кто-нибудь знает такую ​​библиотеку, подходящую для этой задачи?

2 ответа

Первый способ - использовать модуль "с батарейками", например:

Теперь, если вы хотите создать собственный пакет, используйте два способа: scapy создать новый собственный протокол, или вы можете использовать ctypes а также struct вот так:

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

Хотя это может быть немного трудно использовать в реальных сценариях со сложными протоколами, поскольку это требует большой технической работы, обработки ошибок и т. Д., Чтобы быть полным декодером пакетов.

Вы можете использовать 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'
Другие вопросы по тегам