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 全志v3s怎么设置高速时钟,使用的荔枝派zero开发板,串口2需要921600的波特率
  • ¥15 关于#单片机#的问题:Lora通讯模块hc-14电路图求内部原理图
  • ¥50 esp32 wroom 32e 芯片解锁
  • ¥15 bywave配置文件写入失败
  • ¥20 基于Simulink的ZPW2000轨道电路仿真
  • ¥15 pycharm找不到在环境装好的opencv-python
  • ¥15 在不同的执行界面调用同一个页面
  • ¥20 基于51单片机的数字频率计
  • ¥50 M3T长焦相机如何标定以及正射影像拼接问题
  • ¥15 keepalived的虚拟VIP地址 ping -s 发包测试,只能通过1472字节以下的数据包(相关搜索:静态路由)