当前位置: 首页 > 编程笔记 >

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

西门良才
2023-03-14
本文向大家介绍python使用原始套接字发送二层包(链路层帧)的方法,包括了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])

以上这篇python使用原始套接字发送二层包(链路层帧)的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • SAL组件初始化接口 函数 int  sal_init (void)   SAL组件初始化   int  sal_proto_family_register (const struct proto_family *pf)   网络协议簇注册   详细描述 SAL组件初始化接口 函数说明 int sal_init ( void  ) SAL组件初始化 该函数完成对组件中使用的互斥锁等资源的初始化。

  • 或者也许有另一种方法。 OBS.我现在不打算让游戏运行在服务器上对付作弊者。因为这将对我的安装程序中的服务器cpu造成很大的负载。

  • SAL 简介 为了适配更多的网络协议栈类型,避免系统对单一网络协议栈的依赖,RT-Thread 系统提供了一套 SAL(套接字抽象层)组件,该组件完成对不同网络协议栈或网络实现接口的抽象并对上层提供一组标准的 BSD Socket API,这样开发者只需要关心和使用网络应用层提供的网络接口,而无需关心底层具体网络协议栈类型和实现,极大的提高了系统的兼容性,方便开发者完成协议栈的适配和网络相关的开发

  • 我正在编写原始套接字客户端(成功发送UDP数据包)和一个服务器套接字,问题出在服务器部分。 Im按以下方式创建套接字:

  • 本文向大家介绍蓝牙链接层,包括了蓝牙链接层的使用技巧和注意事项,需要的朋友参考一下 蓝牙链路层概述了蓝牙设备可以使用无线电层提供的原始传输功能来交换信息的方式。链接层的功能非常接近OSI模型的MAC(中等访问控制)子层。 下图显示了链路层在蓝牙协议体系结构中的位置- 蓝牙链路层的功能 定义发现蓝牙设备的过程。 在正在通信的蓝牙设备之间建立逻辑链接。一台设备被指定为主设备,另一台被指定为从设备。 广

  • 我制作了一个简单的服务器程序,可以同时从4个不同的客户端接收数据。现在我想用AES-128加密发送一些数据,但应该在服务器端解码。以下是我的服务器代码: 我从客户端发送这样的数据 我应该如何修改我的客户端代码和服务器代码,以便在其中包含AES-128加密。。请在这方面帮助我。