DDNS 的工作原理及其在 Linux 上的实现--转
从清单 6 中可以看到,在绑定应用程序的 netlink 套接字时,我们将自己加入到了 RTMGRP_IPV4_IFADDR 组播 group 中,这与前文我们对内核空间 IP 地址变化事件的通知过程的分析是一致的。 同样与标准的 socket 使用方法类似,用户空间接收内核空间发来的 netlink 消息可以使用 recv、recvfrom 或 recvmsg。值得一提的是,netlink 套接字有自己的消息头:nlmsghdr 结构(该结构具体各成员变量的含义请查看),而其中的 nlmsg_type 正是我们需要用到的包含了消息类型的字段。
while((len = receive_netlink_message(&nl)) > 0)
free(nl); int receive_netlink_message(struct nlmsghdr **nl) nl = NULL; iov.iov_base = *nl; // 封装 nlmsghdr
FREE(*nl);
} 应用程序在收到了 RTM_NEWADDR 类型的 netlink 消息后,需要根据 IP 的变化进行处理。这里使用了 handle_newaddr 函数,对 IP 的变化分为了两种情况:一种是 interface 已经存在、仅仅是 IP 发生了变化;另一种是 interface 是新添加的。无论是哪种情况,handle_newaddr 函数在进行了相应的处理之后,都需要调用 update_dns.sh 这个脚本通知 DNS 服务器。关于 update_dns.sh 的实现参见下一章。
|
// 没有找到对应的 interface,说明该 interface 是新添加的
if((i = calloc(sizeof(struct if_info),1)) == NULL)// 分配一个 if_info 结构用于添加新的 interface
exit(1);
// 根据 ifinfo->ifi_index 等信息更新 if_info 结构 i,考虑到与 ddns 应用关系不大,限于篇幅,这里略过
......
system(update_dns.sh); // 执行 update_dns.sh
i->next = if_list; // 在 if_list 的末尾添加新发现的 interface
if_list = i;
}
应用程序可以利用开源工具 nsupdate 来向 DNS 服务器发送 DNS update 消息。nsupdate 的详细用法及特性可以请查看,受篇幅所限,本章将会结合例子简单介绍这个工具的基本用法。
(编辑:淮北站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!