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,也能很快接到,所以觉得是不是,一直在监听?
希望各位指点下!