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

作者:linux_c_coding_man 时间:2022-06-30 04:14:48 

发送端代码:


#!/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

标签:python,套接字,链路层
0
投稿

猜你喜欢

  • opencv+mediapipe实现人脸检测及摄像头实时示例

    2022-08-11 17:58:44
  • Python3中.whl文件创建及使用

    2022-11-05 00:17:50
  • keras Lambda自定义层实现数据的切片方式,Lambda传参数

    2021-03-18 09:16:20
  • 适宜做简单搜索的MySQL数据库全文索引

    2009-01-04 13:11:00
  • python中使用xlrd、xlwt操作excel表格详解

    2023-06-25 03:59:51
  • 使用python 获取进程pid号的方法

    2023-06-11 21:25:52
  • 记一次MySQL更新语句update的踩坑

    2024-01-16 19:35:29
  • golang validator库参数校验实用技巧干货

    2024-04-23 09:38:17
  • 基于python框架Scrapy爬取自己的博客内容过程详解

    2021-12-21 06:39:30
  • JavaScript错误处理

    2023-09-23 08:26:37
  • JavaScript中利用for循环遍历数组

    2024-03-17 02:21:54
  • python实现维吉尼亚算法

    2023-07-02 01:28:17
  • vue项目使用node连接数据库的方法(前后端分离)

    2024-01-27 14:08:54
  • php集成环境xampp中apache无法启动问题解决方案

    2023-07-17 22:44:52
  • 微信小程序利用Canvas绘制图片和竖排文字详解

    2023-08-20 02:35:43
  • [翻译]标记语言和样式手册 Chapter 1 清单

    2008-01-15 10:26:00
  • Ubuntu Server 11.10安装配置lamp(Apache+MySQL+PHP)

    2023-11-17 02:55:00
  • js 数据存储和DOM编程

    2024-02-24 07:52:31
  • 用CSS定义 li 样式

    2007-09-28 20:56:00
  • Windows7中配置安装MySQL 5.6解压缩版

    2024-01-26 16:02:34
  • asp之家 网络编程 m.aspxhome.com