【问题标题】:detecting connected interface using c++ in linux在linux中使用c ++检测连接的接口
【发布时间】:2013-04-10 05:38:19
【问题描述】:

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

【问题讨论】:

  • 那么……除了想要东西的哲学,还有一个问题吗?
  • @WhozCraig 是的;怎么做?

标签: c++ linux networking tcp routing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    当然,您也可以使用非常低的级别并使用ioctl(7)。有关示例,请参阅 Adam Risilsif

    【讨论】:

    • 感谢您的回答,但您的 ioctl 链接已损坏(尽管在互联网上很容易找到 ioctl 手册)。
    • 谢谢,已修复(. 和 / 在我的键盘上非常接近...)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 2016-03-14
      • 1970-01-01
      相关资源
      最近更新 更多