我正在尝试使用 C 代码wpa_supplicant在运行 linux 的 ARM 嵌入式系统中进行访问。搜索后,我意识到我可以使用wpa_supplicant控制界面。我尝试打开一个connection using wpa_ctrl_open(),并导致“连接被拒绝”错误:
无法连接到 wpa_supplicant 全局接口:/var/run/wpa_supplicant 错误:连接被拒绝
我用来测试的代码:
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/sockios.h>
#include <netinet/if_ether.h>
#include <net/if.h>
#include <sys/socket.h>
#include <sys/un.h>
#include "includes.h"
#ifdef CONFIG_CTRL_IFACE_UNIX
#include <dirent.h>
#endif /* CONFIG_CTRL_IFACE_UNIX */
#include "wpa_ctrl.h"
#include "common.h"
struct wpa_ctrl {
int s;
#ifdef CONFIG_CTRL_IFACE_UDP
struct sockaddr_in local;
struct sockaddr_in dest;
#else // CONFIG_CTRL_IFACE_UDP
struct sockaddr_un local;
struct sockaddr_un dest;
#endif // CONFIG_CTRL_IFACE_UDP
};
static struct wpa_ctrl *ctrl_conn;
int main(int argc,char **argv)
{
const char *global = "/var/run/wpa_supplicant";
ctrl_conn = wpa_ctrl_open(global);
if (ctrl_conn == NULL)
{
fprintf(stderr, "Failed to connect to wpa_supplicant "
"global interface: %s error: %s\n",global,strerror(errno));
return -1;
}
else
{
printf("Success\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在跟踪 wpa_ctrl.c 中的代码后,我发现问题出在以下 IF 条件上,在 wpa_ctrl_open2() 函数内部:
if (connect(ctrl->s, (struct sockaddr *) &ctrl->dest,sizeof(ctrl->dest)) < 0)
Run Code Online (Sandbox Code Playgroud)
我不知道是什么问题以及如何解决它。
在同一台机器上,我尝试运行wpa_cli,它可以完美访问wpa_supplicant。
我使用以下命令进行编译:
GCC -o test_wpa的main.c wpa_ctrl.c os_unix.c -DCONFIG_BACKEND_FILE -DCONFIG_IEEE80211W -DCONFIG_DRIVER_WEXT -DCONFIG_WIRELESS_EXTENSION -DCONFIG_DRIVER_NL80211 -DCONFIG_LIBNL20 -DEAP_PSK -DIEEE8021X_EAPOL -DCONFIG_SHA256 -DCONFIG_CTRL_IFACE -DCONFIG_CTRL_IFACE_UNIX -DCONFIG_SME -lrt
wpa_supplicant 代码(包括 wpa_ctrl.c 和 os_unix.c)可以在这里下载:http ://w1.fi/releases/wpa_supplicant-2.5.tar.gz
提前谢谢了!
我找到了解决问题的方法,在路径后面添加“wlan0”:
const char *global = "/var/run/wpa_supplicant/wlan0";
ctrl_conn = wpa_ctrl_open(global);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2254 次 |
| 最近记录: |