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系列之从文件读取和保存数据
May 23 Python
Python脚本实现自动发带图的微博
Apr 27 Python
Python合并字典键值并去除重复元素的实例
Dec 18 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
May 16 Python
Python smtplib实现发送邮件功能
May 22 Python
opencv与numpy的图像基本操作
Mar 08 Python
基于TensorFlow常量、序列以及随机值生成实例
Jan 04 Python
Python3.7黑帽编程之病毒篇(基础篇)
Feb 04 Python
python基于exchange函数发送邮件过程详解
Nov 06 Python
Python使用UDP实现720p视频传输的操作
Apr 24 Python
浅析Python中的套接字编程
Jun 22 Python
Python matplotlib可视化之绘制韦恩图
Feb 24 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
怎么使 Mysql 数据同步
2006/10/09 PHP
类的另类用法--数据的封装
2006/10/09 PHP
PHP Redis扩展无法加载的问题解决方法
2019/08/22 PHP
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
js类中的公有变量和私有变量
2008/07/24 Javascript
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
2012/02/23 Javascript
js函数调用常用方法详解
2012/12/03 Javascript
js点击更换背景颜色或图片的实例代码
2013/06/25 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
2016/01/28 Javascript
Bootstrap每天必学之折叠(Collapse)插件
2016/04/25 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
2016/05/10 Javascript
JavaScript数组的栈方法与队列方法详解
2016/05/26 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
2017/02/09 Javascript
微信小程序实现留言板功能
2018/11/02 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
[03:02]2014DOTA2西雅图邀请赛 让队员自己告诉你DK NAVI备战情况
2014/07/08 DOTA
pyqt5的QComboBox 使用模板的具体方法
2018/09/06 Python
Python零基础入门学习之输入与输出
2019/04/03 Python
如何爬取通过ajax加载数据的网站
2019/08/15 Python
Django表单提交后实现获取相同name的不同value值
2020/05/14 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
JAVA软件工程师测试题
2014/07/25 面试题
应届毕业生的个人自我鉴定
2013/10/24 职场文书
实习生自荐信范文分享
2013/11/27 职场文书
土地租赁意向书
2014/07/30 职场文书
组工干部对照检查材料
2014/08/25 职场文书
2015年学雷锋活动总结
2015/02/06 职场文书
施工员岗位职责范本
2015/04/11 职场文书
李强优秀员工观后感
2015/06/16 职场文书
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电
Docker 镜像介绍以及commit相关操作
2022/04/13 Servers