0

我想编写 ac 代码来显示 ubuntu 中的网络连接类型。我找到了一个名为 connman(连接管理器)的库,而且我还有一个函数 connman_service_get_type 用于获取连接类型。但我不知道如何在代码中使用该功能。谁能给我看一个使用函数“connman_service_get_type”的示例代码

4

1 回答 1

0

ConnMan 是一个连接管理器,用于管理设备的网络连接。它不是用于管理/查询网络信息的通用库。您确定的功能在 ConnMan 的上下文之外不起作用。

如果您尝试确定该接口是否为无线接口,则可以通过查看sysfs内核接口(通常安装在/sys)来确定。为此,请检查/sys/class/net/NETDEVICE/wireless目录是否存在,NETDEVICE设备名称在哪里。如果该目录存在,则它是一个无线接口。

这也可以通过编程方式(在 C 中)完成,如本片段所示。

int check_wireless(const char* ifname, char* protocol) {
  int sock = -1;
  struct iwreq pwrq;
  memset(&pwrq, 0, sizeof(pwrq));
  strncpy(pwrq.ifr_name, ifname, IFNAMSIZ);

  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    perror("socket");
    return 0;
  }

  if (ioctl(sock, SIOCGIWNAME, &pwrq) != -1) {
    if (protocol) strncpy(protocol, pwrq.u.name, IFNAMSIZ);
    close(sock);
    return 1;
  }

  close(sock);
  return 0;
}

可以在https://gist.github.com/edufelipe/6108057找到使用此代码的完整示例。此示例使用IOCTL内核接口来获取信息。

如果您确实在寻找有关接口类型的更多信息,而不是无线与否,那么这里是 OpenSUSE ( git repo ) 用来确定接口类型的 shell 脚本示例。

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
}

这也可以通过 C 代码完成。

于 2021-03-04T16:18:09.403 回答