使用python套接字生成udp包

2024-06-25 23:32:49 发布

您现在位置:Python中文网/ 问答频道 /正文

请任何人帮助解决以下问题:

def __init__(self,source, dest):
    self.source =  socket.inet_aton(source)
    self.dest =  socket.inet_aton(dest)
    self.sport = 68
    self.dport = 67
    self.length = 0
    self.udpchecksum = 0
    self.data = ''

def UDP(self):
    udp_hdr = struct.pack('!HHHH', self.sport,
    self.dport,
    self.length,
    self.udpchecksum)
   #Pseudo header
    psip = self.source
    pdip = self.dest
    reserved = 0
    proto = socket.IPPROTO_UDP
    tlen = len(udp_hdr) + len(self.data)
    pshdr = struct.pack('!4s4sBBH',
            psip,
            pdip,
            reserved,
            proto,
            tlen)
    pshdr = pshdr + udp_hdr+ self.data
    udp_checksum = checksum(pshdr)
    udp_hdr = struct.pack('!HHH',
              self.sport,
              self.dport,
              tlen)
              udp_checksum = struct.pack('H', udp_checksum)
    udp_hdr = udp_hdr + udp_checksum + self.data
    return udp_hdr

def checksum(data):
    s = 0
    n = len(data) % 2
    for i in range(0, len(data)-n, 2):
        s+= ord(data[i]) + (ord(data[i+1]) << 8)
    if n:
        s+= ord(data[i+1])
    while (s >> 16):
        s = (s & 0xFFFF) + (s >> 16)
    s = ~s & 0xffff
    return s

当我使用原始套接字发送数据包时,wireshark上出现错误:

错误的UDP长度

问题是: 使用原始套接字生成UDP包是否合适?在


Tags: selfsourcedatalenhdrdefsocketstruct