2013-04-10 90 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。