抓住我们有wifi连接的时刻

Posted

技术标签:

【中文标题】抓住我们有wifi连接的时刻【英文标题】:Catch moment when we have wifi connection 【发布时间】:2011-02-15 10:14:24 【问题描述】:

我需要编写遵循这些步骤的程序:

    启动程序(守护进程) 等待(睡眠,阻塞)直到我有 wifi 连接 从服务器发送/获取一些数据 等到 wifi 连接中断 转到 2

第 2 步的问题。我不知道如何捕捉已建立网络连接的时刻。有/proc/net/wireless entry,其中显示了有关可用无线连接的信息,但尝试使用 inotify 对其进行监控没有成功。网络连接是异步建立的。

这是我的 inotify 测试代码(主要从 R.Loves 书中复制):

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/inotify.h>
#include <sys/select.h>

#define BUF_LEN 1024

int
main() 

    int fd, wd, rc;
    char buf[BUF_LEN];
    ssize_t len, i = 0;
    static fd_set read_fds;

    fd = inotify_init();
    if (fd == -1) 
        perror("inotify_init");
        exit(EXIT_FAILURE);
    

    wd = inotify_add_watch(fd, "/proc/net/wireless", IN_ALL_EVENTS);
    if (wd == -1) 
        perror("inotify_add_watch");
        exit(EXIT_FAILURE);
    

    for (;;) 

        FD_ZERO(&read_fds);
        FD_SET(wd, &read_fds);
        rc = select(wd + 1, &read_fds, NULL, NULL, NULL);
        if (rc == -1)
            perror("select");

        len = read(fd, buf, BUF_LEN);
        while (i < len) 
            struct inotify_event *event = (struct inotify_event *) &buf[i];
            printf("wd=%d mask=%d cookie=%d len=%d dir=%s\n",
                event->wd, event->mask, event->cookie, event->len, 
                (event-> mask & IN_ISDIR) ? "yes" : "no");
            if (event->len)
                printf("name=%s\n", event->name);

            i += sizeof(struct inotify_event) + event->len;
        

        sleep(1);
    

    return 0;

只有当我做cat /proc/net/wireless时它才会捕捉到evernt

问题:如何捕捉时刻,当我有网络连接(wifi)时,只使用 Linux 功能?

附:这是我在这里的第一篇文章,希望一切都好。

【问题讨论】:

如果你介意我问你是从哪本书获得代码的? 【参考方案1】:

您可以通过 netlink 接口 rtnetlink 检测网络连接(不仅仅是 wifi)何时变为链路就绪。

这不是一个易于编程的接口,因此您可能希望调用进程“ip monitor link”来代替。如果您看到接口有 LOWER_UP 标志,这意味着它已准备好发送/接收(编辑:您可能还想检查 NO_CARRIER 标志是否缺席;请参阅 Simon 的评论)。

但是,还有一个问题是,您可能会遇到像 NetworkManager 这样的守护程序的竞争条件,它会(如果配置)在链接可用后尝试获取 IP 地址。

【讨论】:

LOWER_UP 是不够的,因为有几个实现会在成功接收到信标后立即设置它。您还想检查 NO_CARRIER 标志。 感谢您的更正;我只用有线网络测试过这个。

以上是关于抓住我们有wifi连接的时刻的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 上,是不是可以找出我们连接的 WIFI 网络?

从抗击SARS到再战新型冠状病毒,中国企业家如何抓住商机?

一个APP爆炸的时代,假设没有wifi

surface连接不上wifi

安卓 开了热点 怎么连接wifi

如何破解WiFi禁用? 我们单位设置的无线设备手机、平板,禁止连WiFi,连上就断网,有方法破解吗?