python使用原始套接字发送二层包(链路层帧)的方法


Posted in Python onJuly 22, 2019

发送端代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import socket
import struct

raw_socket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x1234))
raw_socket.bind(("eth0", 0))
packet = struct.pack("!6s6sH", "\xff\xff\xff\xff\xff\xff", "\xaa\xaa\xaa\xaa\xaa\xaa", 0x1234)
while True:
 print repr(packet)
 raw_socket.send(packet + "hello,world!")

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

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

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

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import socket
import struct

raw_socket = socket.socket(socket.PF_PACKET,socket.SOCK_RAW,socket.htons(0x1234))
while True :
 packet = raw_socket.recv(1024)
 data = struct.unpack("!6s6sH12s", packet)
 print repr(data[0])
 print repr(data[1])
 print repr(data[2])
 print repr(data[3])

以上这篇python使用原始套接字发送二层包(链路层帧)的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python标准日志模块logging的使用方法
Nov 01 Python
浅析python中的分片与截断序列
Aug 09 Python
Python实现修改文件内容的方法分析
Mar 25 Python
Python Requests库基本用法示例
Aug 20 Python
python简单实现AES加密和解密
Mar 28 Python
利用Python进行图像的加法,图像混合(附代码)
Jul 14 Python
Python any()函数的使用方法
Oct 28 Python
Python模块的定义,模块的导入,__name__用法实例分析
Jan 07 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
Dec 08 Python
python爬虫线程池案例详解(梨视频短视频爬取)
Feb 20 Python
Scrapy实现模拟登录的示例代码
Feb 21 Python
Python os和os.path模块详情
Apr 02 Python
微信公众号token验证失败解决方案
Jul 22 #Python
django 消息框架 message使用详解
Jul 22 #Python
django 邮件发送模块smtp使用详解
Jul 22 #Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 #Python
Pandas透视表(pivot_table)详解
Jul 22 #Python
django认证系统 Authentication使用详解
Jul 22 #Python
django Admin文档生成器使用详解
Jul 22 #Python
You might like
PHP中获取文件扩展名的N种方法小结
2012/02/27 PHP
php新浪微博登录接口用法实例
2014/12/23 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
YII框架关联查询操作示例
2019/04/29 PHP
js对象的比较
2011/02/26 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
Jquery判断$("#id")获取的对象是否存在的方法
2013/09/25 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
JS清除选择内容的方法
2015/01/29 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
2016/02/28 Javascript
详解AngularJS控制器的使用
2016/03/09 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
详解JavaScript之ES5的继承
2020/07/08 Javascript
vue 接口请求地址前缀本地开发和线上开发设置方式
2020/08/13 Javascript
js实现炫酷光感效果
2020/09/05 Javascript
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
[02:22]完美世界DOTA2联赛PWL S3 集锦第一期
2020/12/15 DOTA
Python程序中设置HTTP代理
2016/11/06 Python
解决seaborn在pycharm中绘图不出图的问题
2018/05/24 Python
破解安装Pycharm的方法
2018/10/19 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
2018/10/31 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
python批量读取文件名并写入txt文件中
2020/09/05 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
Python 用__new__方法实现单例的操作
2020/12/11 Python
python编程的核心知识点总结
2021/02/08 Python
大学生个人自我鉴定
2013/12/03 职场文书
党员个人思想汇报
2013/12/28 职场文书
JS如何使用剪贴板操作Clipboard API
2021/05/17 Javascript
SpringBoot连接MySQL获取数据写后端接口的操作方法
2021/11/02 MySQL
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python
Nginx如何配置根据路径转发详解
2022/07/23 Servers