2012-02-05 41 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