检测Linux中的网络连接类型

发布于 2024-10-08 19:34:17 字数 99 浏览 3 评论 0原文

如何在 C++ Linux 应用程序中检测网络连接类型,例如是有线还是 Wi-Fi?

如果设备有多个网络接口,我想检测正在使用的接口的连接类型。

谢谢。

How can I detect the network connection type, e.g., whether it is wired or Wi-Fi, in a C++ Linux application?

If the device has multiple network interfaces, I would like to detect the connection type for the interface being used.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

清风疏影 2024-10-15 19:34:17

我也一直在寻找这个答案。我在 opensuse gitorious 中发现了一段有趣的代码。显然,他们使用下面的代码来获取接口类型:

get_iface_type () {
    local IF=$1 TYPE
    test -n "$IF" || return 1
    test -d /sys/class/net/$IF || return 2
    case "`cat /sys/class/net/$IF/type`" in
            1)
                TYPE=eth
                # Ethernet, may also be wireless, ...
                if test -d /sys/class/net/$IF/wireless -o \
                        -L /sys/class/net/$IF/phy80211 ; then
                    TYPE=wlan
                elif test -d /sys/class/net/$IF/bridge ; then
                    TYPE=bridge
                elif test -f /proc/net/vlan/$IF ; then
                    TYPE=vlan
                elif test -d /sys/class/net/$IF/bonding ; then
                    TYPE=bond
                elif test -f /sys/class/net/$IF/tun_flags ; then
                    TYPE=tap
                elif test -d /sys/devices/virtual/net/$IF ; then
                    case $IF in
                      (dummy*) TYPE=dummy ;;
                    esac
                fi
                ;;
           24)  TYPE=eth ;; # firewire ;; # IEEE 1394 IPv4 - RFC 2734
           32)  # InfiniBand
            if test -d /sys/class/net/$IF/bonding ; then
                TYPE=bond
            elif test -d /sys/class/net/$IF/create_child ; then
                TYPE=ib
            else
                TYPE=ibchild
            fi
                ;;
          512)  TYPE=ppp ;;
          768)  TYPE=ipip ;; # IPIP tunnel
          769)  TYPE=ip6tnl ;; # IP6IP6 tunnel
          772)  TYPE=lo ;;
          776)  TYPE=sit ;; # sit0 device - IPv6-in-IPv4
          778)  TYPE=gre ;; # GRE over IP
          783)  TYPE=irda ;; # Linux-IrDA
          801)  TYPE=wlan_aux ;;
        65534)  TYPE=tun ;;
    esac
    # The following case statement still has to be replaced by something
    # which does not rely on the interface names.
    case $IF in
        ippp*|isdn*) TYPE=isdn;;
        mip6mnha*)   TYPE=mip6mnha;;
    esac
    test -n "$TYPE" && echo $TYPE && return 0
    return 3
}

我仍然需要找到官方文档来确认 /sys/class/net/$IF/type 中的值意味着什么,但是这个函数已经解释了很多。

编辑:好的,我已经阅读了更多关于 sysfs 的内容,发现这一点是一件令人痛苦的事情。我没有找到任何合适的文档。

您可能知道,这些信息是从内核中提取的,以便在用户空间中显示。因此,我最终查看了 sysfs 的源代码和内核,以了解这个“类型”属性是什么。我相信部分答案应该在 net-sysfs 中找到。 c,也在 linux/device.h 中。我只是不明白这些东西是如何连接的。当我看到我需要理解所有这些宏时,我停了下来......

I have been looking for that answer, too. I found an interesting piece of code in opensuse gitorious. Apparently, they use the following piece of code to get the interface type:

get_iface_type () {
    local IF=$1 TYPE
    test -n "$IF" || return 1
    test -d /sys/class/net/$IF || return 2
    case "`cat /sys/class/net/$IF/type`" in
            1)
                TYPE=eth
                # Ethernet, may also be wireless, ...
                if test -d /sys/class/net/$IF/wireless -o \
                        -L /sys/class/net/$IF/phy80211 ; then
                    TYPE=wlan
                elif test -d /sys/class/net/$IF/bridge ; then
                    TYPE=bridge
                elif test -f /proc/net/vlan/$IF ; then
                    TYPE=vlan
                elif test -d /sys/class/net/$IF/bonding ; then
                    TYPE=bond
                elif test -f /sys/class/net/$IF/tun_flags ; then
                    TYPE=tap
                elif test -d /sys/devices/virtual/net/$IF ; then
                    case $IF in
                      (dummy*) TYPE=dummy ;;
                    esac
                fi
                ;;
           24)  TYPE=eth ;; # firewire ;; # IEEE 1394 IPv4 - RFC 2734
           32)  # InfiniBand
            if test -d /sys/class/net/$IF/bonding ; then
                TYPE=bond
            elif test -d /sys/class/net/$IF/create_child ; then
                TYPE=ib
            else
                TYPE=ibchild
            fi
                ;;
          512)  TYPE=ppp ;;
          768)  TYPE=ipip ;; # IPIP tunnel
          769)  TYPE=ip6tnl ;; # IP6IP6 tunnel
          772)  TYPE=lo ;;
          776)  TYPE=sit ;; # sit0 device - IPv6-in-IPv4
          778)  TYPE=gre ;; # GRE over IP
          783)  TYPE=irda ;; # Linux-IrDA
          801)  TYPE=wlan_aux ;;
        65534)  TYPE=tun ;;
    esac
    # The following case statement still has to be replaced by something
    # which does not rely on the interface names.
    case $IF in
        ippp*|isdn*) TYPE=isdn;;
        mip6mnha*)   TYPE=mip6mnha;;
    esac
    test -n "$TYPE" && echo $TYPE && return 0
    return 3
}

I still have to find official documentation to confirm what the value in /sys/class/net/$IF/type means, but this function already explains a lot.

EDIT: ok, I've read about sysfs a little more, and finding that out is a pain in the ass. I've not found any proper documentation.

As you may know, this information is pulled from the kernel in order to be presented in userspace. So I ended up looking in the sources of sysfs and in the kernel in order to understand what is this "type" attribute. I believe that part of the answer should be found in net-sysfs.c, and also in linux/device.h. I just can't figure out how this stuff is connected. I stopped when I saw that I needed to understand all these macros...

假装不在乎 2024-10-15 19:34:17

如果该接口存在于 /proc/net/wireless 中,则它是无线接口。否则,就不是。

If the interface is present in /proc/net/wireless, it is a wireless interface. Otherwise, it is not.

无言温柔 2024-10-15 19:34:17

感谢您的所有投入。

我提出的解决方案:

  1. /proc/net/dev 获取所有活动接口的名称和 ip 地址

  2. 通过映射使用的ip地址获取当前接口

  3. 通过查看<来检查当前接口是否是无线的code>/proc/net/wireless

Thanks for all the inputs.

The solution I come up:

  1. get all active interfaces' names and ip addresses from /proc/net/dev

  2. get the current interface by mapping the ip address used

  3. Check whether the current interface is wireless by looking at /proc/net/wireless

○闲身 2024-10-15 19:34:17

根据所使用的接口,eth 或 wlan。

By the interface which is used, eth or wlan.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文