xushan239 2015-01-24 03:07 采纳率: 0%
浏览 1827

wpa_supplicant的UNIX域的进程间通信

wpa_ctrl_open(const char *ctrl_path)这个函数的socket(),bind(),connect()这三个函数;
在应用程序会调用两次wpa_ctrl_open(),创建一个ctrl和一个monitor,这个还好理解;这是控制口的结构:

 struct wpa_ctrl {
    ....
    int s;
    struct sockaddr_un local; 
    struct sockaddr_un dest;
    ....
    };

首先创建一个sockfd,再将它与local绑定,local的path是wpa的一个什么路径不大懂,而后面又用dest也就传入到wpa_ctrl_open()里面的ctrl_path路径,问题:
1. local表示的是什么意思?
2. unix daemon IPC 为什么有个local了还要有个dest?
3. 为什么bind()和connect()不是同一个地点?
4. 这两个路径怎么通信?
我在wpa_cli的代码里

static void wpa_cli_interactive(void)
{
#define max_args 10
    char cmdbuf[256], *cmd, *argv[max_args], *pos;
    int argc;

    printf("\nInteractive mode\n\n");

    do {
        //wpa_cli_recv_pending(mon_conn, 0, 0);
        ALOG("wpa_cli_recv_pending----1");
        alarm(ping_interval);
        printf("==== ping_interval = %d =====\n",ping_interval); //ALOG()
        printf("> ");
        cmd = fgets(cmdbuf, sizeof(cmdbuf), stdin);
        alarm(0);
        if (cmd == NULL)
            break;
        //wpa_cli_recv_pending(mon_conn, 0, 0);
        ALOG("wpa_cli_recv_pending----2");
        pos = cmd;
        while (*pos != '\0') 
        {
            if (*pos == '\n') 
            {
                *pos = '\0';
                break;
            }
            pos++;
        }
        argc = 0;
        pos = cmd;
        for (;;) 
        {
            while (*pos == ' ')
                pos++;
            if (*pos == '\0')
                break;
            argv[argc] = pos;
            argc++;
            if (argc == max_args)
                break;
            if (*pos == '"') 
            {
                char *pos2 = os_strrchr(pos, '"');
                if (pos2)
                    pos = pos2 + 1;
            }
            while (*pos != '\0' && *pos != ' ')
                pos++;
            if (*pos == ' ')
                *pos++ = '\0';
        }
        {
            int i=0;
            for(i=0;i<argc;i++)
            {
                printf("#######  %s\n",argv[i]);
            }
        }
        if (argc)
            wpa_request(ctrl_conn, argc, argv);

        if (cmd != cmdbuf)
            free(cmd);
    } while (!wpa_cli_quit);
}

把两个地方的wpa_cli_recv_pending()都屏蔽掉了,但是通过另一个wpa_cli应用向wpa_supplicant发disable_net的命令,原来的wpa_cli还是能够很快收到monitor的信息,这是在哪监听到的;
这个消息是从wpa_cli_recv_pending()打印出来的,不确定是不是因为alarm()的原因;如果是的话,为什么很快就能接到消息呢?他不是有个定时时间的吗?而且我把原来的定时时间从5s改到了10s,也能很快接到,所以觉得是不是,一直在监听?

希望各位指点下!

  • 写回答

1条回答 默认 最新

  • xushan239 2015-02-02 11:56
    关注

    help 啊!!!!!!!!!!!!

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题