python-3.x - 如何将广播数据包发送到特定的 MAC 地址
问题描述
我有下面的代码来发送一个广播数据包来测试我的网络。代码有效,但 Dst mac 地址为 ff:ff:ff:ff:ff:ff。如何将 Dst Mac 地址更改为特定的 mac 地址?
import socket
import time
SERVER_ADDRESS = "localhost"
SERVER_PORT = 10000
# create a socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
server.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #socket.SO_BROADCAST
server.settimeout(0.2)
address = (SERVER_ADDRESS,SERVER_PORT)
print(f"server {SERVER_ADDRESS} at port {SERVER_PORT}")
server.bind(("",60550))
message = b"This is AJ Testing Broadcast on the network using Python................"
while True:
# broadcast
server.sendto(message, ('255.255.255.255', 60551))
print("message sent!")
time.sleep(2)```
解决方案
您需要打开原始套接字而不是普通UDP
套接字。RAW 套接字让您可以控制发送的整个数据包。打开原始套接字使用
import socket
import sys
try:
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
except socket.error:
print('Socket could not be created. Error Code')
sys.exit()
# build your packet and send it as normal using socket.send() method.
请注意,要打开原始套接字,您必须具有 root 访问权限,因此请使用sudo
. 另请注意,这样您就可以完全访问发送到空中的数据包,因此您必须熟悉将携带有效负载(您的数据)的以太网帧的数据结构格式。作为旁注,您必须禁用网卡校验和作为预防措施sudo ethtool -K eth1 tx off
,以防您使用有线连接。
推荐阅读
- python - 通过 pip 安装程序安装 M2Crypto 的问题
- java - Tomcat 8.5 上的 Apache cxf 回车问题
- sqlite - Unbale 在 Ionic 4 中使用 SQLite 创建表
- mysql - 在mysql中更新else INSERT
- elasticsearch - Kibana 字符串搜索逗号
- java - 使用 GSON 将 JSON 对象转换为不同格式的 Java 对象
- android - 在一个智能手机屏幕上显示 wordpress 内容
- atom-editor - Atom 不会从命令行启动
- automation - Automation Anywhere:在 PDF 集成中,提取表单字段无法正常工作?
- r - 找不到列名?