orangepi4b 搜索wifi的C程序
以下是搜索WiFi的示例C程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <linux/wireless.h>
#define IW_SCAN_MAX_DATA 2048
int main(int argc, char *argv[]) {
int sock_fd, iw_scan_max_data;
struct iwreq iw_req;
char scan_data[IW_SCAN_MAX_DATA];
struct iw_scan_req scan_req;
struct iw_range range;
int i;
// 创建套接字
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (sock_fd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// 获取范围信息
memset(&range, 0, sizeof(range));
if (ioctl(sock_fd, SIOCGIWRANGE, &iw_req) < 0) {
perror("SIOCGIWRANGE");
exit(EXIT_FAILURE);
}
// 设置扫描请求
memset(&scan_req, 0, sizeof(scan_req));
scan_req.scan_type = IW_SCAN_TYPE_PASSIVE;
scan_req.scan_time = 3000; // 3秒
// 获取扫描结果
memset(scan_data, 0, IW_SCAN_MAX_DATA);
memset(&iw_req, 0, sizeof(iw_req));
strncpy(iw_req.ifr_name, "wlan0", IFNAMSIZ); // 修改为你的无线网卡
iw_req.u.data.pointer = (caddr_t) &scan_req;
iw_req.u.data.length = sizeof(scan_req);
if (ioctl(sock_fd, SIOCSIWSCAN, &iw_req) < 0) {
perror("SIOCSIWSCAN");
exit(EXIT_FAILURE);
}
sleep(3); // 等待扫描完成
memset(&iw_req, 0, sizeof(iw_req));
strncpy(iw_req.ifr_name, "wlan0", IFNAMSIZ); // 修改为你的无线网卡
iw_req.u.data.pointer = (caddr_t) scan_data;
iw_req.u.data.length = IW_SCAN_MAX_DATA;
if (ioctl(sock_fd, SIOCGIWSCAN, &iw_req) < 0) {
perror("SIOCGIWSCAN");
exit(EXIT_FAILURE);
}
// 输出扫描结果
iw_scan_max_data = range.we_max_data + IW_SCAN_MAX_DATA;
for (i = 0; i < iw_scan_max_data; i += sizeof(struct iw_event)) {
struct iw_event *event = (struct iw_event *) (scan_data + i);
if (event->cmd == SIOCGIWAP) {
struct sockaddr *addr = (struct sockaddr *) (event + 1);
char addr_str[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &addr->sa_data[2], addr_str, INET_ADDRSTRLEN);
printf("%s\n", addr_str);
}
}
close(sock_fd);
exit(EXIT_SUCCESS);
}
注意:需要将程序中的"wlan0"修改为你的无线网卡名称
原文地址: https://www.cveoy.top/t/topic/fiXu 著作权归作者所有。请勿转载和采集!