如何在Python中发送具有给定十六进制有效载荷的IP数据包?

yeg*_*v-p 0 python sockets igmp

我已经嗅探了一个IGMP数据包,现在我想在python的帮助下发送它。有什么办法可以发送像

0x0000   01 00 5E 00 43 67 00 02-B3 C8 7F 44 81 00 00 DE   ..^.Cg..??D?..?
0x0010   08 00 46 00 00 20 00 01-00 00 01 02 36 4C C0 A8   ..F.. ......6L??
0x0020   00 7B EA 00 43 67 94 04-00 00 16 00 BC 97 EA 00   .{?.Cg”.....?—?.
0x0030   43 67                                             Cg
Run Code Online (Sandbox Code Playgroud)

没有像流浪者这样的数据包生成器?

UPD好吧,我尝试使用原始套接字,如下所示:

dst = '234.0.67.103'

# Open a raw socket.
s = socket.socket(socket.AF_INET, socket.SOCK_RAW,2)

res=''

temp='01 00 5E 00 43 67 00 02 B3 C8 7F 44 81 00 00 DE 08 00 46 00 00 20 00 01 00 00 01 02 36 4C C0 A8 00 7B EA 00 43 67 94 04 00 00 16 00 BC 97 EA 00 43 67'
for i in temp.split(' '):
    res+=chr(int(i, 16))
print res
s.sendto(res, (dst, 0))
Run Code Online (Sandbox Code Playgroud)

除了一件小事情,一切都很好...如果我嗅到那个小包,看起来像这样:

0x0000   01 00 5E 00 43 67 00 02-B3 C8 7F 44 08 00 45 00   ..^.Cg..??D..E.
0x0010   00 46 07 06 00 00 01 02-C4 25 C0 A8 00 7B EA 00   .F......?%??.{?.
0x0020   43 67 01 00 5E 00 43 67-00 02 B3 C8 7F 44 81 00   Cg..^.Cg..??D?.
0x0030   00 DE 08 00 46 00 00 20-00 01 00 00 01 02 36 4C   .?..F.. ......6L
0x0040   C0 A8 00 7B EA 00 43 67-94 04 00 00 16 00 BC 97   ??.{?.Cg”.....?—
0x0050   EA 00 43 67                                       ?.Cg
Run Code Online (Sandbox Code Playgroud)

如您所见,由于某种原因,python会忽略我的标头并创建自己的标头。我该如何解决?

小智 5

由于Unix网络编程(第3版):

sockfd = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
# inform os about that program are compose ip header
sockfd.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, True)
Run Code Online (Sandbox Code Playgroud)