我正在尝试使用C代码在运行Linux的ARM嵌入式系统中访问wpa_supplicant。搜索之后,我意识到可以使用wpa_supplicant控制界面。我尝试打开connection using wpa_ctrl_open(),并导致“连接被拒绝”错误:



我用来测试的代码:

#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;
}

在wpa_ctrl.c中跟踪代码后,我发现问题出在wpa_ctrl_open2()函数内部的以下IF条件下:
if (connect(ctrl->s, (struct sockaddr *) &ctrl->dest,sizeof(ctrl->dest)) < 0)

我不知道问题是什么以及如何解决。

在同一台计算机上,我尝试运行wpa_cli,它可以完美地访问wpa_supplicant。

我使用以下命令进行编译:



可以在此处下载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);

关于wpa_ctrl_open上的连接被拒绝,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35407739/

10-13 02:37