4

我想检测现在连接的是哪个接口;我有三个 3g-modem 连接和两个到服务器的 lan 连接(我的设备不支持 wlan)。我的意思是连接的类型并不重要,但接口名称和细节对我来说很重要。我想在我用 C++ 编写的程序中检测连接的接口。请告诉我如何在 C++ 中检测连接的接口?(root 权限不是问题。)

4

3 回答 3

8

用于ioctl SIOCGIFFLAGS检查接口是否 UP 和 RUNNING:

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 );

记住关闭套接字,不再使用时。

于 2013-04-10T05:54:24.900 回答
3

如果您使用的是 NetworkManager,则可以使用它的API。您可以使用 D-Bus API、GLib 包装、D-Bus 的 C++ 绑定

如果您使用的是 Qt,则可以直接使用QtNetwork

当然,您也可以非常低级并使用ioctl(7). 参见Adam Risilsif示例。

于 2013-04-10T05:56:06.497 回答
1

您还可以使用 netlink 路由套接字。请参阅libnetlink库,或 man 7 netlink 和 man 7 rtnetlink。

于 2013-04-11T08:32:45.700 回答