我有一个程序有两个独立的部分:其中一个应该在网络接口是无线局域网时执行,另一个应该在有线局域网连接时执行。我怎么知道我的程序内部?我应该使用什么功能来获取这些信息?
答案 0 :(得分:8)
您可以从命令行使用iwconfig命令:
$ iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
如果您需要在C中使用它,正如上面的@ opaque链接所解释的那样,获取源代码或使用strace来查看您需要使用的ioctls():
ioctl(3, SIOCGIWNAME, 0x7fff82c0d040) = -1 EOPNOTSUPP (Operation not supported)
ioctl(3, SIOCGIFFLAGS, {ifr_name="lo", ifr_flags=IFF_UP|IFF_LOOPBACK|IFF_RUNNING}) = 0
write(2, "lo no wireless extensions"..., 35lo no wireless extensions.
) = 35
ioctl(3, SIOCGIWNAME, 0x7fff82c0d040) = -1 EOPNOTSUPP (Operation not supported)
ioctl(3, SIOCGIFFLAGS, {ifr_name="eth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
write(2, "eth0 no wireless extensions"..., 35eth0 no wireless extensions.
) = 35
#define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */
/* SIOCGIWNAME is used to verify the presence of Wireless Extensions.
* Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"...
答案 1 :(得分:5)
如果您的设备名称为NETDEVICE
,则检查/sys/class/net/NETDEVICE/wireless
目录是否存在是您可以使用的谓词。这是一种仅限Linux的方法,它假设/sys
已挂载,这几乎总是正常情况。从脚本中使用此方法也更容易,而不是处理ioctl()s。
答案 2 :(得分:4)
您可以拨打ioctl(fd, SIOCGIWNAME)
,返回无线扩展协议版本,该版本仅适用于无线接口。
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
答案 3 :(得分:2)
有可能从C,当然得到它。
查看此link以获取有关类似问题的信息。
答案 4 :(得分:1)
如果您定位NetworkManager,请查看其API,C examples和NMDeviceType。