python使用原始套接字发送二层包(链路层帧)的方法
作者:linux_c_coding_man 发布时间:2022-06-30 04:14:48
标签:python,套接字,链路层
发送端代码:
#!/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])
来源:https://blog.csdn.net/peng314899581/article/details/78082244
0
投稿
猜你喜欢
- 网站,(100-1)%的内容是导航1、Jesse James Garrett 在《用户体验要素》一书中提到了多重导航系统:全局导航、局部导航
- 插入排序插入排序,英文名(insertion sort)是一种简单且有效的比较排序算法。思想: 在每次迭代过程中算法随机地从输入序
- 1.Pytorch中的LSTM中输入输出参数nn.lstm是继承nn.RNNBase,初始化的定义如下:class RNNBase(Modu
- 本文和大家重点讨论一下Perl split函数的用法,Perl中的一个非常有用的函数是Perl split函数-把字符串进行分割并把分割后的
- 一 修改root密码的三种办法方法1: 用SET PASSWORD命令首先登录MySQL。格式:mysql> set password
- 特点:不需要另外加个清除DIV:after(伪对象)--设置在对象后发生的内容,通常和content配合使用,IE不支持此伪对象,非Ie 浏
- 说明C# 调用 Python 程序有多种方式,本篇用的是第 4 种:nuget的ironPython;用 c/c++ 调用python,再封
- 闭包内容:匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能闭包:能够完成
- 概述我们在使用mysql的时候,尤其是在创建数据库的时候,我们需要选择当前数据库的字符集和排序规则,这样你库里面的创建数据表的时候默认的编码
- pymysql写入中文直接写入中文会出现错误。根据网上的方法,设置my.ini不成功sql = "INSERT INTO comp
- 简介介绍使用vue3的异步组件动态管理对话框组件,简化对话框组件使用方式。本文使用的是vue3、typescript、element_plu
- 一、生产者消费者模型介绍1.1 为什么需要使用生产者消费者模型生产者是指生产数据的任务,消费者是指消费数据的任务。当生产者的生产能力远大于消
- 写爬虫是一个发送请求,提取数据,清洗数据,存储数据的过程。在这个过程中,不同的数据源返回的数据格式各不相同,有 JSON 格式,有 XML
- 本文实例讲述了security.js实现的RSA加密功能。分享给大家供大家参考,具体如下:在项目中遇到要对用户输入的密码进行RSA加密的需求
- 引言在做项目的时候难免会遇到很多奇葩解析字符串的需求,简单的字符串通过内置方法就能解析出来,如果遇到复杂的就不好办了,那我们如何解决复杂字符
- 开放源代码社区为了扩展MySQL的使用范围,开发出了.Net框架(.NET Framework)中可以使用的数据库连接器。我们就来学习一下如
- 本文实例讲述了Python实现文件内容批量追加的方法。分享给大家供大家参考,具体如下:#coding:utf-8import os#----
- <html> <head> <script language="javasc
- 在python中,可以把for循环写在一行,生成一个新的列表,使用起来非常方便,下面举几个简单例子体会一下。1.简单的for...[if].
- 本文探讨了提高MySQL数据库性能的思路,并从8个方面给出了具体的解决方法。1、选取最适用的字段属性MySQL可以很好的支持大数据量的存取,