2010-10-07 60 views
1

在我的linux機器上,3個網絡接口中有1個可能實際連接到互聯網。我需要獲取當前連接的接口的IP地址,請記住,我的其他2個接口可能分配了IP地址,只是不能連接。確定python中CONNECTED接口(linux)的IP地址

我可以通過每個接口ping一個網站來確定哪個網絡具有連通性,但是我希望比等待ping時間更快。我想不必依靠外部網站。

更新:

我所有的接口可能有IP地址和網關。這是針對嵌入式設備的。所以我們允許用戶選擇說eth0eth1。但是,如果用戶告訴我們使用的界面上沒有連接,我們就會說eth2哪個(理論上)將始終有效。

所以我需要做的是首先檢查用戶的選擇是否連接,如果是這樣返回該IP。否則,我需要獲得IP eth2。我可以很好地獲得接口的IP,只是確定哪一個實際連接。

+0

什麼分類的界面爲 「下」?它沒有網關嗎?它有一個網關,但網關將無法訪問? – 2010-10-07 19:35:07

+2

只有通過查看IP才能確定路由。作爲一個例子,不止一個接口可以路由到互聯網(認爲有線和無線)。它們中的任何一個都可以(直接)路由到互聯網,但可能在處理某些流量的路徑中有代理。 – Joe 2010-10-07 19:35:21

+0

除非您使用ICMP,TCP/IP,UDP等與互聯網中的某個服務器建立連接,否則沒有任何連接到Internet的事情。除非您與某個服務通話並收到回覆,否則不能說您已連接否則到互聯網。 – 2010-10-07 19:59:42

回答

0

如果系統的默認網關是可靠的,那麼從route -n的輸出中抓取包含" UG "(注意空格)的行將包含活動接口的網關IP和接口名稱。

0

的解決方案是在這裏:http://code.activestate.com/recipes/439093-get-names-of-all-up-network-interfaces-linux-only/


import fcntl 
import array 
import struct 
import socket 
import platform 
""" 
global constants. If you don't like 'em here, 
move 'em inside the function definition. 
""" 
SIOCGIFCONF = 0x8912 
MAXBYTES = 8096 

def localifs(): 
    """ 
    Used to get a list of the up interfaces and associated IP addresses 
    on this machine (linux only). 

    Returns: 
    List of interface tuples. Each tuple consists of 
    (interface name, interface IP) 
    """ 
    global SIOCGIFCONF 
    global MAXBYTES 

    arch = platform.architecture()[0] 

    # I really don't know what to call these right now 
    var1 = -1 
    var2 = -1 
    if arch == '32bit': 
     var1 = 32 
     var2 = 32 
    elif arch == '64bit': 
     var1 = 16 
     var2 = 40 
    else: 
     raise OSError("Unknown architecture: %s" % arch) 

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    names = array.array('B', '\0' * MAXBYTES) 
    outbytes = struct.unpack('iL', fcntl.ioctl(
     sock.fileno(), 
     SIOCGIFCONF, 
     struct.pack('iL', MAXBYTES, names.buffer_info()[0]) 
     ))[0] 

    namestr = names.tostring() 
    return [(namestr[i:i+var1].split('\0', 1)[0], socket.inet_ntoa(namestr[i+20:i+24])) \ 
      for i in xrange(0, outbytes, var2)] 


print localifs() 

+1

有人投票...如果他們關心評論它會有助於我瞭解我的錯誤! – jknair 2010-10-07 20:08:30

+0

海報的問題更加抽象,您特別發佈的代碼是關於具有「鏈接」的接口,因爲海報說每個接口都可能有鏈接,但可能無法連接到互聯網。 – synthesizerpatel 2010-10-07 20:30:54