首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用库connman (连接管理器)和函数connman_service_get_type查找网络连接类型

使用库connman (连接管理器)和函数connman_service_get_type查找网络连接类型
EN

Stack Overflow用户
提问于 2020-12-16 20:31:52
回答 1查看 105关注 0票数 0

我想写一个c代码来显示ubuntu.I中的网络连接类型,我找到了一个名为connman (连接管理器)的库,我还得到了一个用于获取连接类型的函数connman_service_get_type。但是我不知道如何在代码中使用这个函数。有没有人能给我看一个使用"connman_service_get_type“函数的示例代码?

EN

回答 1

Stack Overflow用户

发布于 2021-03-05 00:18:09

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

如果您正在尝试确定该接口是否是无线接口,那么可以通过查看内核(通常挂载在/sys上)的sysfs接口来确定。为此,请检查是否存在/sys/class/net/NETDEVICE/wireless目录,其中NETDEVICE是设备名称。如果该目录存在,则它是一个无线接口。

这也可以通过编程方式(用C语言)完成,如下面的代码片段所示。

代码语言:javascript
复制
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脚本示例。

代码语言:javascript
复制
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代码中完成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65323341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档