我想写一个c代码来显示ubuntu.I中的网络连接类型,我找到了一个名为connman (连接管理器)的库,我还得到了一个用于获取连接类型的函数connman_service_get_type。但是我不知道如何在代码中使用这个函数。有没有人能给我看一个使用"connman_service_get_type“函数的示例代码?
发布于 2021-03-05 00:18:09
ConnMan是一个连接管理器,用于管理设备的网络连接。它不是用于管理/查询网络信息的通用库。您确定的函数在ConnMan上下文之外不起作用。
如果您正在尝试确定该接口是否是无线接口,那么可以通过查看内核(通常挂载在/sys上)的sysfs接口来确定。为此,请检查是否存在/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代码中完成。
https://stackoverflow.com/questions/65323341
复制相似问题