首页 > 解决方案 > 如何将广播数据包发送到特定的 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)```

标签: python-3.x

解决方案


您需要打开原始套接字而不是普通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,以防您使用有线连接。


推荐阅读