2012-02-05 40 views
1

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

我当前工作的代码是(不幸的是用硬编码“为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,但那也不管用。

+0

“套接字”函数的第三个参数是协议类型,它不应该是“0x8888”,而应该是“网络顺序中的IEEE 802.3协议号”(参见http://www.kernel.org/doc /man-pages/online/pages/man7/packet.7.html) – 2012-02-05 17:54:13

+0

大多数计算机有几个不同的接口。我的笔记本电脑有5个,例如:eth6,wlan0,lo,tunl0,sit0。你如何区分它们以达到你的目的? – 2012-02-05 17:54:33

+0

我使用的协议实际上是协议ID为0x8888的原始以太网II协议(它不是IP协议!),因此socket的第三个参数是正确的。该协议的反向工程描述在:http://wiki.kainhofer.com/hardware/vap11g_wlan_bridge – 2012-02-05 18:03:48

回答

0

您可以使用子进程,并重新获得网络接口的列表:

import subprocess, re 

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

的ifconfig也有让你看到“向下”的接口虽然我不认为你需要他们的选择如果你想播放。有关更多详细信息,请参阅man ifconfig