linux下使用c++检测连接的接口

detecting connected interface using c++ in linux

本文关键字:连接 接口 检测 c++ linux      更新时间:2023-10-16

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

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

如果你正在使用NetworkManager,你可以使用它的API。你可以使用D-Bus API, GLib包装,c++绑定D-Bus。

如果你正在使用Qt,你可以直接使用QtNetwork。

当然,您也可以非常低级地使用ioctl(7)

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