2013-04-10 82 views
4

我想檢測現在連接了哪個接口;我有三個3g調制解調器連接和兩個局域網連接到服務器(我的設備不支持wlan)。我的意思是連接的類型並不重要,但接口名稱和細節對我來說很重要。我想檢測我用C++編寫的程序中的連接接口。 ?請告訴我如何檢測在C連接的接口++(root權限是沒有問題的。)在linux中使用C++檢測連接的接口

+2

所以......除了想要東西的哲學之外,還有一個問題嗎? – WhozCraig 2013-04-10 05:53:29

+1

@WhozCraig yes;如何? – Lrrr 2013-04-10 06:36:14

回答

3

如果使用NetworkManager的,你可以使用它的API。您可以使用d-Bus的API,GLib的包裝,C++ Bindings for D-Bus

如果你是使用Qt,你可以直接使用QtNetwork

當然,你也可以去非常低的水平,並使用ioctl(7)。以lsif爲例,Adam Risi爲例。

+0

感謝您的回答,但您的ioctl鏈接已損壞(雖然在互聯網上很容易找到ioctl手冊)。 – Lrrr 2013-04-10 07:17:43

+0

謝謝,修正(和/在我的鍵盤上真的很接近...) – 2013-04-10 07:23:06

5

使用ioctlSIOCGIFFLAGS檢查是界面運行起來:

struct ifreq ifr; 

memset(&ifr, 0, sizeof(ifr)); 
strcpy(ifr.ifr_name, ifrname); 

if(ioctl(dummy_fd, SIOCGIFFLAGS, &ifr) != -1) 
{ 
    up_and_running = (ifr.ifr_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING); 
} 
else 
{ 
    // error 
} 

輸入變量是ifrname。它應該是接口名稱「eth0的」,eth1" 的,‘ppp0的’......

因爲ioctl()需要一個文件描述符作爲參數,你可以使用例如用於一些臨時UDP套接字:

dummy_fd = socket(AF_INET, SOCK_DGRAM, 0); 

記得關閉插座,當不再使用。

1

你也可以使用netlink路由套接字。請參閱libnetlink庫或man 7 netlink和man 7 rtnetlink。