ubuntu1804 wifi搜网 C程序
以下是一个简单的C程序,用于扫描和连接wifi网络。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <errno.h>
#include <time.h>
#define MAX_SSID_LEN 32
#define MAX_BSS_LEN 18
typedef struct {
char ssid[MAX_SSID_LEN];
char bssid[MAX_BSS_LEN];
int signal;
} wifi_ap_t;
wifi_ap_t *wifi_scan() {
wifi_ap_t *aps = NULL;
int sock, i;
struct iwreq wrq;
char *buffer = NULL;
int buflen = IW_SCAN_MAX_DATA;
int ap_count = 0;
// Open a socket
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1) {
perror("socket");
return NULL;
}
// Allocate memory for the buffer
buffer = malloc(buflen);
if (!buffer) {
perror("malloc");
close(sock);
return NULL;
}
memset(&wrq, 0, sizeof(struct iwreq));
strncpy(wrq.ifr_name, "wlan0", IFNAMSIZ);
wrq.u.data.pointer = buffer;
wrq.u.data.length = buflen;
wrq.u.data.flags = 0;
// Issue the SCAN request
if (ioctl(sock, SIOCSIWSCAN, &wrq) == -1) {
perror("ioctl[SIOCSIWSCAN]");
free(buffer);
close(sock);
return NULL;
}
// Wait for the scan to complete
sleep(5);
// Issue the GET SCAN RESULTS request
if (ioctl(sock, SIOCGIWSCAN, &wrq) == -1) {
perror("ioctl[SIOCGIWSCAN]");
free(buffer);
close(sock);
return NULL;
}
// Parse the scan results
struct iw_event *event = (struct iw_event *)buffer;
while ((unsigned char *)event < (unsigned char *)buffer + buflen) {
if (event->cmd == SIOCGIWAP) {
ap_count++;
}
event = (struct iw_event *)((unsigned char *)event + event->len);
}
// Allocate memory for the AP list
aps = malloc(sizeof(wifi_ap_t) * ap_count);
if (!aps) {
perror("malloc");
free(buffer);
close(sock);
return NULL;
}
// Fill in the AP list
event = (struct iw_event *)buffer;
i = 0;
while ((unsigned char *)event < (unsigned char *)buffer + buflen && i < ap_count) {
if (event->cmd == SIOCGIWAP) {
struct sockaddr *addr = (struct sockaddr *)event->u.ap_addr.sa_data;
snprintf(aps[i].bssid, MAX_BSS_LEN, "%02x:%02x:%02x:%02x:%02x:%02x",
(unsigned char)addr->sa_data[0],
(unsigned char)addr->sa_data[1],
(unsigned char)addr->sa_data[2],
(unsigned char)addr->sa_data[3],
(unsigned char)addr->sa_data[4],
(unsigned char)addr->sa_data[5]);
event = (struct iw_event *)((unsigned char *)event + IW_EV_ADDR_LEN);
} else if (event->cmd == SIOCGIWESSID) {
memcpy(aps[i].ssid, event->u.essid.pointer, event->u.essid.length);
aps[i].ssid[event->u.essid.length] = '\0';
event = (struct iw_event *)((unsigned char *)event + IW_EV_POINT_LEN(event));
} else if (event->cmd == SIOCGIWRATE) {
aps[i].signal = event->u.qual.level;
i++;
event = (struct iw_event *)((unsigned char *)event + IW_EV_CHAR_LEN);
} else {
event = (struct iw_event *)((unsigned char *)event + event->len);
}
}
free(buffer);
close(sock);
return aps;
}
int wifi_connect(char *ssid, char *password) {
FILE *fp;
char cmd[256];
char buf[256];
char *pos;
// Get the network interface name
fp = popen("iw dev | awk '$1==\"Interface\"{print $2}'", "r");
if (!fp) {
perror("popen");
return -1;
}
fgets(buf, sizeof(buf), fp);
pos = strchr(buf, '\n');
if (pos) {
*pos = '\0';
}
pclose(fp);
// Connect to the network
snprintf(cmd, sizeof(cmd), "wpa_passphrase \"%s\" \"%s\" | sudo tee /etc/wpa_supplicant.conf > /dev/null",
ssid, password);
system(cmd);
snprintf(cmd, sizeof(cmd), "sudo wpa_supplicant -B -i %s -c /etc/wpa_supplicant.conf", buf);
system(cmd);
return 0;
}
int main(int argc, char **argv) {
wifi_ap_t *aps;
int ap_count, i;
aps = wifi_scan();
if (!aps) {
printf("Error scanning for wifi networks\n");
return 1;
}
ap_count = sizeof(aps) / sizeof(wifi_ap_t);
printf("Found %d wifi networks:\n", ap_count);
for (i = 0; i < ap_count; i++) {
printf(" %s (%s): %d dBm\n", aps[i].ssid, aps[i].bssid, aps[i].signal);
}
wifi_connect("SSID", "password");
return 0;
}
请注意,此程序仅在Ubuntu 18.04上进行过测试,并且需要在Root权限下运行
原文地址: https://www.cveoy.top/t/topic/fiXp 著作权归作者所有。请勿转载和采集!