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中定义结构体的方法
Mar 04 Python
Python3基础之函数用法
Aug 13 Python
Python实现Logger打印功能的方法详解
Sep 01 Python
TensorFlow实现卷积神经网络CNN
Mar 09 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
python基础教程项目三之万能的XML
Apr 02 Python
Flask实现跨域请求的处理方法
Sep 27 Python
PyCharm配置mongo插件的方法
Nov 30 Python
详解Python并发编程之创建多线程的几种方法
Aug 23 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
Feb 25 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
Dec 01 Python
jupyter notebook更换皮肤主题的实现
Jan 07 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
3.从实例开始
2006/10/09 PHP
PHP 5.5 创建和验证哈希最简单的方法详解
2013/11/07 PHP
Symfony查询方法实例小结
2017/06/28 PHP
面向对象的Javascript之一(初识Javascript)
2012/01/20 Javascript
jquery ajax请求实例深入解析
2012/11/26 Javascript
js实现幻灯片播放图片示例代码
2013/11/07 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
js使用for循环及if语句判断多个一样的name
2014/09/09 Javascript
javascript日期格式化方法汇总
2015/10/04 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
详解iframe与frame的区别
2016/01/13 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
微信小程序 Video API实例详解
2016/10/02 Javascript
JavaScript简单生成 N~M 之间随机数的方法
2017/01/13 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
Python中print和return的作用及区别解析
2019/05/05 Python
pandas-resample按时间聚合实例
2019/12/27 Python
django API 中接口的互相调用实例
2020/04/01 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
通过实例了解python__slots__使用方法
2020/09/14 Python
python 基于Apscheduler实现定时任务
2020/12/15 Python
html5 兼容IE6结构的实现代码
2012/05/14 HTML / CSS
HTML5 canvas标签实现刮刮卡效果
2015/04/24 HTML / CSS
客服实习的个人自我鉴定
2013/10/20 职场文书
网络宣传方案
2014/03/15 职场文书
质量月口号
2014/06/20 职场文书
维稳承诺书
2015/01/20 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
无违反计划生育证明格式
2015/06/24 职场文书
2019年入党思想汇报
2019/03/25 职场文书
JS代码编译器Monaco使用方法
2021/06/11 Javascript
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript
搭建Yolov5服务器
2022/04/30 Servers