python如何使用原始套接字发送二层包

  介绍

这篇文章给大家分享的是有关python如何使用原始套接字发送二层包的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

<强>发送端代码:

# !/usr/bin/python   #,- *安康;编码:UTF-8  - * -      import 套接字   import 结构      时间=raw_socket  socket.socket (socket.PF_PACKET, socket.SOCK_RAW,, socket.htons (0 x1234))   raw_socket.bind (“eth0",, 0))   时间=packet  struct.pack (“! 6 s6sh",,“\ xff \ xff \ xff \ xff \ xff \ xff",,“\ xaa \ xaa \ xaa \ xaa \ xaa \ xaa",, 0 x1234)   while 真正的:   repr(包),print    ,raw_socket.send (packet  +,“你好,世界!“)

1。创建套接字使用地址家族PF_PACKET,类型为SOCK_RAW,自定义类型为0 x1234,这个和C语言一模一样。自定义类型我们也可以使用0 x0800,这个是ETH_P_IP,相当于我们模拟ip包来发送,那么ip包头和mac包头都需要我们自己填写。现在我们使用0 x1234,系统定义之外的协议类型。

2。由于是发送二层包,我们默认网卡没有配置网络,也就是平不通的情况下,直接绑定网卡上。

3。linux内核中定义的mac包头结构

struct  ethhdr   {   ,unsigned  char  h_dest [6];   ,unsigned  char  h_source [6];   ,uint16_t  h_proto;//0 x1234   };

第一个是目的mac地址,第二个是本mac机地址,第三个是自定义类型必须填写,这样对方也关心这个自定义类型时,协议栈收到二层包才能正确给到对方的套接字。通过这个结构体,所以使用了包,”!6 s6sh”。我这里使用的广播地址发送。
接收端代码:

# !/usr/bin/python   #,- *安康;编码:UTF-8  - * -      import 套接字   import 结构      时间=raw_socket  socket.socket (socket.PF_PACKET socket.SOCK_RAW, socket.htons (0 x1234))   while  True :=,,packet  raw_socket.recv (1024)=,,data  struct.unpack (“! 6 s6sh12s",,包)   ,print  repr(数据[0])   ,print  repr(数据[1])   ,print  repr(数据[2])   ,print  repr(数据[3])

感谢各位的阅读!关于“python如何使用原始套接字发送二层包”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

python如何使用原始套接字发送二层包