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 相关文章推荐
py中的目录与文件判别代码
Jul 16 Python
在Python中使用成员运算符的示例
May 13 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 Python
Python学习小技巧之利用字典的默认行为
May 20 Python
基于并发服务器几种实现方法(总结)
Dec 29 Python
Pandas读取MySQL数据到DataFrame的方法
Jul 25 Python
python通过ffmgep从视频中抽帧的方法
Dec 05 Python
python运行时强制刷新缓冲区的方法
Jan 14 Python
详解python中的生成器、迭代器、闭包、装饰器
Aug 22 Python
python实现图片插入文字
Nov 26 Python
django Model层常用验证器及自定义验证器详解
Jul 15 Python
python实现计算图形面积
Feb 22 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
使用数据库保存session的方法
2006/10/09 PHP
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
2013/08/01 PHP
Symfony生成二维码的方法
2016/02/04 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
javascript:void(0)的真正含义实例分析
2008/08/20 Javascript
ajax无刷新动态调用股票信息(改良版)
2008/11/01 Javascript
Jquery AJAX POST与GET之间的区别
2013/11/14 Javascript
Flexigrid在IE下不显示数据的有效处理方法
2014/09/04 Javascript
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
JavaScript中eval()函数用法详解
2015/12/14 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
json_decode 索引为数字时自动排序问题解决方法
2020/03/28 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
2020/06/22 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
老生常谈Python序列化和反序列化
2017/06/28 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
python使用tomorrow实现多线程的例子
2019/07/20 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
Python如何解除一个装饰器
2020/08/07 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的代码
2020/11/30 HTML / CSS
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
Antler英国官网:购买安特丽行李箱、拉杆箱
2019/08/25 全球购物
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
linux面试题参考答案(6)
2014/08/29 面试题
销售副总经理岗位职责
2013/12/11 职场文书
公司酒会主持词
2015/07/02 职场文书
公司财务管理制度
2015/08/04 职场文书
《实心球》教学反思
2016/02/23 职场文书
「Manga Time Kirara MAX」2022年5月号封面公开
2022/03/21 日漫
Python借助with语句实现代码段只执行有限次
2022/03/23 Python