Определить тип сетевого подключения в Linux - PullRequest
4 голосов
/ 18 декабря 2010

Как определить тип сетевого подключения, например, проводное или Wi-Fi, в приложении C ++ Linux?

Если устройство имеет несколько сетевых интерфейсов, я хотел бы определить тип подключения для используемого интерфейса.

Спасибо.

Ответы [ 4 ]

5 голосов
/ 17 апреля 2013

Я тоже искал этот ответ. Я нашел интересный кусок кода в 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 и в ядро, чтобы понять, что это за атрибут type. Я считаю, что часть ответа должна быть найдена в net-sysfs.c , а также в linux / device.h. Я просто не могу понять, как все это связано. Я остановился, когда увидел, что мне нужно понять все эти макросы ...

1 голос
/ 18 декабря 2010

Если интерфейс присутствует в / proc / net / wireless, это беспроводной интерфейс.В противном случае это не так.

0 голосов
/ 18 декабря 2010

Спасибо за все вклады.

Решение, которое я придумаю:

  1. получить имена и IP-адреса всех активных интерфейсов от /proc/net/dev

  2. получить текущий интерфейс путем сопоставления используемого IP-адреса

  3. Проверьте, является ли текущий интерфейс беспроводным, посмотрев на /proc/net/wireless

0 голосов
/ 18 декабря 2010

интерфейсом, который используется, eth или wlan.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...