【发布时间】:2020-03-24 01:04:37
【问题描述】:
我目前有一个应用程序,它使用 popen(nmcli...) 获取 essid 和信号强度,我正在尝试使用 wireless.h 和 ioctl 切换到纯 C。获取 ESSID 很容易,但是尝试通过 SIOCGIWSTATS 获取强度/质量一直给我一个“不支持操作”错误。谁能发现我做错了什么,或者只是我的无线驱动程序实际上不支持 SIOCGIWSTATS?
请忽略全局变量的使用,这只是我调试当前问题时的临时性。
谢谢,
海顿。
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <ifaddrs.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/wireless.h>
#include <stdlib.h>
#include <errno.h>
char ifname[IFNAMSIZ];
char essid[IW_ESSID_MAX_SIZE+1];
struct iwreq wrq;
struct iw_statistics *iwstats;
int sock;
int findWifi() {
struct ifaddrs *ifaddr, *ifa;
if (getifaddrs(&ifaddr) == -1) {
perror("Error getting interface addresses");
return -1;
}
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
strncpy(wrq.ifr_name, ifa->ifa_name, IFNAMSIZ);
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("Error opening INET socket");
}
if (ioctl(sock, SIOCGIWNAME, &wrq) == 0) {
printf("IF: %s\n", wrq.ifr_name);
strcpy(ifname, wrq.ifr_name);
freeifaddrs(ifaddr);
return sock;
}
}
freeifaddrs(ifaddr);
return 0;
}
int wifiInfo() {
wrq.u.essid.pointer = essid;
if (ioctl(sock, SIOCGIWESSID, &wrq) == -1) {
perror("Can't open socket to obtain essid");
return(-1);
}
printf("ESSID is %s\n", wrq.u.essid.pointer);
memset(&iwstats, 0, sizeof(iwstats));
wrq.u.data.pointer = (caddr_t) &iwstats;
wrq.u.data.length = sizeof(&iwstats);
wrq.u.data.flags = 1;
// ERROR HERE...
if (ioctl(sock, SIOCGIWSTATS, &wrq) == -1) {
perror("Can't open socket to obtain iwstats");
return(-1);
}
return(0);
}
int main(int argc, char const *argv[]) {
findWifi();
wifiInfo();
return 0;
}
【问题讨论】: