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