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 (не проверено):
Хотя это может быть немного трудно использовать в реальных сценариях со сложными протоколами, поскольку это требует большой технической работы, обработки ошибок и т. Д., Чтобы быть полным декодером пакетов.
Вы можете использовать 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'