Linux下C语言检测WiFi连接的几种方法

在Linux系统中,使用C语言检测WiFi是否已连接通常涉及到对网络接口的状态进行检查。以下是一些常用的方法和示例代码:

方法一:使用ioctl系统调用检查网络接口状态

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>
int is_wifi_connected(const char *interface) {
    int sock;
    struct ifreq ifr;
    sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock < 0) {
        perror("socket");
        return -1;
    }
    memset(&ifr, 0, sizeof(ifr));
    strncpy(ifr.ifr_name, interface, IFNAMSIZ - 1);
    if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) {
        perror("ioctl");
        close(sock);
        return -1;
    }
    close(sock);
    // 检查IFF_UP和IFF_RUNNING标志
    if ((ifr.ifr_flags & IFF_UP) && (ifr.ifr_flags & IFF_RUNNING)) {
        return 1; // WiFi已连接
    } else {
        return 0; // WiFi未连接
    }
}
int main() {
    const char *wifi_interface = "wlan0";
    if (is_wifi_connected(wifi_interface)) {
        printf("WiFi is connected.\n");
    } else {
        printf("WiFi is not connected.\n");
    }
    return 0;
}

方法二:解析/sys/class/net/wlan0/operstate文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int is_wifi_connected(const char *interface) {
    char path[64];
    char state[16];
    FILE *fp;
    snprintf(path, sizeof(path), "/sys/class/net/%s/operstate", interface);
    fp = fopen(path, "r");
    if (!fp) {
        perror("fopen");
        return -1;
    }
    if (fscanf(fp, "%15s", state) != 1) {
        perror("fscanf");
        fclose(fp);
        return -1;
    }
    fclose(fp);
    return strcmp(state, "up") == 0 ? 1 : 0;
}
int main() {
    const char *wifi_interface = "wlan0";
    if (is_wifi_connected(wifi_interface)) {
        printf("WiFi is connected.\n");
    } else {
        printf("WiFi is not connected.\n");
    }
    return 0;
}

方法三:使用wpa_cli命令并解析输出

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int is_wifi_connected(const char *interface) {
    char command[64];
    char output[256];
    FILE *fp;
    snprintf(command, sizeof(command), "wpa_cli -i %s status | grep wpa_state", interface);
    fp = popen(command, "r");
    if (!fp) {
        perror("popen");
        return -1;
    }
    if (fgets(output, sizeof(output), fp) == NULL) {
        perror("fgets");
        pclose(fp);
        return -1;
    }
    pclose(fp);
    return strstr(output, "COMPLETED") != NULL ? 1 : 0;
}
int main() {
    const char *wifi_interface = "wlan0";
    if (is_wifi_connected(wifi_interface)) {
        printf("WiFi is connected.\n");
    } else {
        printf("WiFi is not connected.\n");
    }
    return 0;
}

注意事项:

  1. 确保你的程序有足够的权限执行ioctl调用或读取/sys文件系统。
  2. 根据你的系统环境,无线接口名称可能不是wlan0,需要根据实际情况进行修改。
  3. 方法三依赖于wpa_cli工具,确保该工具已安装并可用。
    选择适合你需求的方法,并根据实际情况进行适配和调试。