python中原始套接字的网络接口?

时间:2012-02-05 17:45:16

标签: python raw-sockets

我正在使用带有Ethernet II proto 0x8888的原始套接字为Python中的无线网桥编写一个小配置实用程序。关于python的原始套接字有几个教程,但是所有这些教程似乎都对网络接口(“eth0”,“eth1”等)进行了硬编码,这是我不想要的,因为每台计算机可能有不同的网络接口(在我的笔记本电脑上是“wlan0”)。

我当前的工作代码是(不幸的是硬编码的“wlan0”):

# Create an Ethernet II broadcast of ethertype 0x8888:
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, 0x8888)
s.bind(("wlan0",0x8888))
ifName,ifProto,pktType,hwType,hwAddr = s.getsockname()
txFrame = struct.pack("!6s6sH","\xFF\xFF\xFF\xFF\xFF\xFF",hwAddr,0x8888) + "\x00"*0x32
# Send and wait for response
s.send(txFrame)

有没有办法在当前系统上获取网络接口名称而不必对其进行硬编码?

我尝试过INADDR_ANY,但这也不起作用。

1 个答案:

答案 0 :(得分:0)

您可以使用subprocess和re来获取网络接口列表:

import subprocess, re

config = subprocess.check_output("ifconfig")
expr = re.compile("([a-zA-Z0-9]+)\s+Link")
interfaces = expr.findall(config)

ifconfig还有一些选项,允许您查看“关闭”界面,但如果您想广播,我认为您不需要它们。有关详细信息,请参阅man ifconfig