gpt4 book ai didi

捕获我们有 wifi 连接的时刻

转载 作者:太空狗 更新时间:2023-10-29 11:20:31 26 4
gpt4 key购买 nike

我需要按照以下步骤编写程序:

  1. 启动程序(守护进程)
  2. 等待( sleep ,阻塞)直到我连接上 wifi
  3. 从服务器发送/获取一些数据
  4. 等到 wifi 连接断开
  5. 转到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 功能时,如何捕捉瞬间?

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

最佳答案

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

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

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

关于捕获我们有 wifi 连接的时刻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5002304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com