首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从netlink消息中提取当前路由,附加代码

从netlink消息中提取当前路由的代码如下:

代码语言:c
复制
#include<linux/netlink.h>
#include<linux/rtnetlink.h>
#include <net/if.h>
#include <netinet/in.h>
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include <sys/socket.h>
#include <unistd.h>

#define BUFFER_SIZE 4096

int main() {
    int sockfd;
    struct sockaddr_nl sa;
    char buffer[BUFFER_SIZE];
    struct nlmsghdr *nlh;
    struct rtmsg *rtm;
    struct rtattr *rta;
    int len;

    sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
    if (sockfd < 0) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    memset(&sa, 0, sizeof(sa));
    sa.nl_family = AF_NETLINK;
    sa.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE;

    if (bind(sockfd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
        perror("bind");
        exit(EXIT_FAILURE);
    }

    nlh = (struct nlmsghdr *)buffer;
    rtm = (struct rtmsg *)NLMSG_DATA(nlh);
    rta = (struct rtattr *)RTM_RTA(rtm);

    nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
    nlh->nlmsg_type = RTM_GETROUTE;
    nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
    nlh->nlmsg_seq = 1;
    nlh->nlmsg_pid = getpid();

    rtm->rtm_family = AF_UNSPEC;
    rtm->rtm_table = RT_TABLE_MAIN;

    len = send(sockfd, nlh, nlh->nlmsg_len, 0);
    if (len < 0) {
        perror("send");
        exit(EXIT_FAILURE);
    }

    len = recv(sockfd, buffer, BUFFER_SIZE, 0);
    if (len < 0) {
        perror("recv");
        exit(EXIT_FAILURE);
    }

    close(sockfd);

    return 0;
}

这段代码使用了Linux内核的netlink消息机制,通过socket通信来获取当前路由信息。代码中使用了AF_NETLINK协议族,RTMGRP_LINKRTMGRP_IPV4_ROUTERTMGRP_IPV6_ROUTE组来监听路由信息的变化。通过send函数发送请求,recv函数接收响应,然后解析响应中的路由信息。

这段代码可以用于获取当前路由信息,但是需要注意的是,这个代码只能在Linux系统上运行。如果需要在其他系统上运行,需要使用相应的系统调用来实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

零代码编程:用Kimichat从PDF文件中批量提取图片

一个PDF文件中,有很多图片,想批量提取出来,可以借助kimi智能助手。...要完成一个网页爬取Python脚本的任务,具体步骤如下: 打开文件夹:E:\6451 读取里面的PDF文件; 将PDF文件里面的图片都保存到E:\6451 注意:图片体积较大,占用内存高,要将PDF文件中的图片分批次提取...,而不是一次性提取所有图片 kim生成的Python源代码: import fitz # PyMuPDF import os # 定义文件夹路径 folder_path = 'E:\\6451' # 确保文件夹存在...page_number in range(len(doc)): page = doc[page_number] img_list = page.get_images(full=True) # 分批次提取页面中的图片...在vscode中运行Python程序,成功提取所有图片:

14310

靠谱的SeLinux强制访问控制技术

netif 网络接口 如eth0 netlink_audit_socket 用于控制审核的Netlink套接字 netlink_dnrt_socket 用于控制DECnet路由的Netlink套接字...netlink_kobject_uevent_socket 用于创建用户空间接收内核事件通知的Netlink套接字 netlink_route_socket 用于控制和管理网络资源如路由表和IP地址的...unix_dgram_socket 本地机器上(unix 域)的 IPC 数据报套接字 unix_stream_socket 本地机器上(unix 域)的 IPC 流套接字 IPC有关的客体类别 ipc 已经没有使用了 msg 消息队列中的消息...msgq 消息队列 sem 信号量 shm 共享内存段 其它杂类客体类别 capability Linux中标识权利的特权 process Selinux中的进程 security 内核中的...Selinux安全服务器 system 整个系统 文件客体类别 file append 附加到文件内容(即用 o_append 标记打开) create 创建一个新文件 entrypoint

1.2K10
  • 内核通信之 Netlink 源码分析和实例分析

    目前 netlink 的这种机制被广泛使用在各种场景中,在 Linux 内核中使用 netlink 进行应用与内核通信的应用很多; 包括:路由 daemon(NETLINK_ROUTE),用户态 socket...diag.c 对 netlink sock 进行监控,可以插入到内核或者从内核中卸载 genetlink.c 这个可以看作是 netlink 的升级版本,或者说是一种高层封装。...如下面的代码,代码来自我的测试代码 https://github.com/helight/kernel_modules/tree/master/netlink_test 中的客户端代码,可以看出:PF_NETLINK...*/ 测试例子代码 netlink 内核建立 socket 过程 内核的代码非常简单,这里给出了核心代码,就这么多,接收函数中直接打印了接收到的消息。...我是在看 ipvs 的代码时候看到了里面有 netlink 的使用,发现早期 iptables 就是使用 netlink 来下发配置指令的,内核中 netfilter 和 iptables 中还有这部分的代码

    3.4K30

    Linux用户空间与内核空间通信(Netlink通信机制)

    netlink family),通常与一个或一组内核服务/组件相关联,如NETLINK_ROUTE用于获取和设置路由与链路信息、NETLINK_KOBJECT_UEVENT用于内核向用户空间的udev进程发送通知等...(3) nlmsg_flags:附加在消息上的额外说明信息,如上面提到的NLM_F_MULTI。...nladdr应该包含接收消息的目的地址,其中包括了消息发送者的pid和多播组。同时,宏NLMSG_DATA(nlh),定义在netlink.h中,返回一个指向netlink消息负载的指针。...与UDP发送数据相比,Netlink多了一个消息头结构struct nlmsghdr需要我们构造。 注意代码注释中的A、B、C三处分别设置了pid。...我们看一下内核代码的逻辑,收到用户消息后,根据消息中的pid发送回去,而pid为0,内核并不认为这是用户程序,认为是自身,所有又将回发的10个消息发给了自己(内核),这样就陷入了一个死循环,而用户态这时候进程一直处于

    4.8K10

    learning vpp:简单网络流量监控插件sflow plugins (1)

    网络流数据通常从各种网络设备(例如服务器、路由器、交换机和防火墙)收集。这些设备监控并记录通过设备的流量,捕获源和目标 IP 地址、端口号、协议类型和时间戳等详细信息。...sFlow 的当前版本是 v5。sFlow(采样流的缩写)在以太网层工作,检查通过设备物理网络接口的每 N 个数据报中的 1 个(通常为 1:1000 或 1:10000)。...PSAMPLE API 在幕后使用 [ NetLink ]。这里的想法是,一些sFlow Agent(特别是 VPP 插件)将从物理网络接口定期采样并生成 Netlink 消息。...大概处理逻辑如下: 提取以太网报头:从数据包中提取以太网报头。 获取输入接口:从 VPP 缓冲区中提取输入接口(hw_if_index)。请注意,sFlow 与物理网络接口配合使用!...检查样本数量: 如果当前工作线程中处理的样本过多,则丢弃该样本,并增加错误计数器。这可以防止主线程因过多样本而受到影响。

    21010

    实现 Linux 系统防火墙(包过滤、状态防火墙、NAT)

    用户空间与内核空间的通信通过 Netlink Socket 实现,在此之上自定义一套数据交换协议。使用 sendto()函数向内核发送消息,recvmsg()函数从内核接收消息。...在/filter_manager/getall 路由下处理从数据库中检索所有过滤规则并将检索的数据通过 JSON 格式响应发送。...在/filter_manager/del 路由下处理删除过滤规则的请求,同 add 操作类似,先执行命令从服务器将规则删除,成功之后就从 MySQL 数据库中删除规则。...在 filter_manager/getact 路由下从 MySQL 数据库中检索当前默认的过滤规则。...在/filter_manager/getact 路由下处理获取当前默认策略的请求,通过 SQL 语句获取 t_act 表中的关于规则的前 100 条数据,并将获取到的数据通过 JSON 发送到前端页面

    69110

    试试Linux下的ip命令,ifconfig已经过时了

    这种用法用于在无类域内路由选择(CIDR)中来显示所用的子网掩码。在这个例子中,子网掩码是255.255.255.0。...列出路由表条目 ip命令的路由对象的参数还可以帮助你查看网络中的路由数据,并设置你的路由表。第一个条目是默认的路由条目,你可以随意改动它。 在这个例子中,有几个路由条目。...假设现在你有一个IP地址,你需要知道路由包从哪里来。可以使用下面的路由选项(译注:列出了路由所使用的接口等): $ ip route get 10.42.0.47 ?...监控netlink消息 也可以使用ip命令查看netlink消息。monitor选项允许你查看网络设备的状态。比如,所在局域网的一台电脑根据它的状态可以被分类成REACHABLE或者STALE。...在这个例子中,当ppp0接口被激活和在它被停止和再次激活之后,你可以看到相应的路由表条目。这个接口可能是wlan0或者eth0。

    2.4K60

    注意-polaris僵尸网络正在攻击全球Netlink路由器

    从暴露资产的角度看,此次被公布漏洞利用的设备属于一款比较老的路由器产品,而这类资产往往是攻击者青睐的目标。...同时,我们在对样本进行分析的过程中,也发现了Mirai的变种。另外,我们发现僵尸网络在验证漏洞利用的过程中,通常会尝试探测多个漏洞,且针对的目标设备从路由器到NAS,多种多样。...二、脆弱性分析 该漏洞针对Netlink GPON路由器的Web服务触发的PATH_INFO为:/boaform/admin/formPing,通过向body中的特定位置插入命令,仅需发送一条POST请求即可触发...另外,该主机还在利用SeowonIntech WiMAX SWC-9100路由器的一个远程代码执行漏洞投递样本,漏洞利用详情参见EDB-ID:39074[4]。...图4.4 样本请求的恶意域名返回结果 5其他发现 最后,我们结合了绿盟科技威胁捕获系统和绿盟威胁情报平台NTI中的攻击源IP、3月期间暴露在互联网上的Netlink GPON路由器,以及绿盟威胁挖掘分析系统

    1.4K30

    容器 Flannel vxlan 基本原理和验证

    在最新的 Flannel vxlan 代码 vxlan.go 官方有一段注释说明如下: ? ? 大致意思: Flannel 的第一个版本,l3miss 学习,通过查找 ARP 表 MAC 完成的。...Flannel的最新版本,移除了 l2miss 学习的需求,不再监听 netlink 消息。...它的工作模式: 创建 vxlan 设备,不再监听任何 l2miss 和 l3miss 事件消息 为远端的子网创建路由 为远端主机创建静态 ARP 表项 创建 FDB 转发表项,包含 VTEP MAC 和远端...这种方式存在明显的缺陷: l2miss 和 l3miss 方案缺陷 每一台 Host 需要配置所有需要互通 Guest 路由,路由记录会膨胀,不适合大型组网 通过 netlink 通知学习路由的效率不高...,同时主机中迭代着两层网络配置带来了一定的复杂性,但最终无论方案如何变化都离不开二三层路由转发的基本原则。

    1.8K21

    基于HAProxy+Keepalived高可用负载均衡web服务的搭建

    并且它的运行模式使得它可以很简单安全的整合进当前的架构中, 同时可以保护web服务器不被暴露到网络上。...一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候...3.vrrp协议 在现实的网络环境中,两台需要通信的主机大多数情况下并没有直接的物理连接。对于这样的情况,它们之间路由怎样选择?...主机如何选定到达目的主机的下一跳路由,这个问题通常的解决方法有两种: 在主机上使用动态路由协议(RIP、OSPF等) 在主机上配置静态路由 很明显,在主机上配置动态路由是非常不切实际的,因为管理...VRRP的目的就是为了解决静态路由单点故障问题,VRRP通过一竞选(election)协议来动态的将路由任务交给LAN中虚拟路由器中的某台VRRP路由器。

    88620

    VPP 相关的一些开源项目

    它使用VPPsb的router插件,它实现了将控制包推到Linux网络堆栈的逻辑,以及一个基于netlink的机制,它将Linux的路由表同步到VPP的FIB中。...在过去的四年里,解决这个问题的捷径是基于VPP提供的示例代码实现一个路由器“插件”。这段代码的问题在于它在架构上有缺陷,您越是试图修复它,问题就变得越困难。...虽然这只影响在路由器上终止的网络流(比如BGP UPDATE消息),但在我们看来还是太慢了。现有路由器插件代码的这类问题非常严重,需要我们也维护一个自定义的FRR变体,以正确地使用VPP。...现在所有这些问题都解决了,原来的TNSR路由器插件已经被linux-cp插件取代。我们从Cisco的Neale Raans编写的代码开始——然后花了将近6个月的时间来改进代码并将其融入TNSR。...无论是FRR还是一个简单的“ip route”命令,任何进程添加、更改或删除路由的Netlink消息都被正确地跟踪并反映到VPP。

    2.4K20

    Keepalived - Keepalived 实现 tomcat双机热备

    ,实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该...这样的话就可以保证路由器的高可用了。...} track_script { chk_tomcat } } 与主节点的配置上的区别,需要注意 state 表示一个是主机一个是备机,mcast_src_ip 当前服务器的...转为 MASTER的时候 ,执行 /etc/keepalived/a.sh 当节点从MASTER 转为 BACKUP的时候 ,执行 /etc/keepalived/b.sh ---- 小结 MASTER...和 BACKUP,预先分配好, 通过priority 来确定, 当MASTER宕机以后,BACKUP 没有收到 MASTER的 VRRP消息,BACKUP就认为 MASTER宕机了,这个时候就把自己选举为

    1.2K20

    Android热插拔事件处理详解

    三、典型流程描述 (SD卡挂载流程)         整个过程从Kernel检测到SD卡插入事件开始,之前的一些硬件中断的触发以及driver的加载这里并不叙述,一直到SD卡挂载消息更新到“Android...在该类中可以找到这个方法:CommandListener::VolumeCmd::runCommand(),从字面意思上来看这个方法就是对Volume分发指令的解析。...至此,SD的挂载已算初步完成,接下来应该将SD卡挂载后的消息发送给上层,在13中也提到过,在挂载以及检查的过程中其实也有发送消息给上层的。      16.   ...在Memory.java中收到以后会在Setting界面进行更新,系统设置——存储中会更新SD卡的状态。从而SD卡的挂载从底层到达了上层。  四、Vold 1....();   // 向nl_table[ssk->sk_protocol].mc_list中的每个sock发送此netlink消息     sk_for_each_bound(sk, node,

    5.6K81

    001.Keepalived简介

    一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候...Keepalived一旦在传输层探测到相应端口没用响应数据返回,则认为此端口发生异常,从而将此端口对应的节点从服务器集群中剔除。...等各种不同类型的高层协议,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived的工作方式,来设定监测各种程序或服务是否正常,若监测结果与设定的正常结果不一致,将此服务对应的节点从服务器集群中剔除...内核空间:主要包括IPVS:IP虚拟服务器,用于实现网络服务的负载均衡; NETLINK:提供高级路由及其他相关的网络功能。...IPVS wrapper:用户发送设定的规则到内核ipvs代码 Netlink Reflector:用来设定vrrp的vip地址等。

    51830

    500代码行代码手写docker-设置网络命名空间

    让网络命名空间内部的网络包能够从网络命名空间内部出去到达主机上。...其实很容易,拿当前ip减去网络号就是ip偏移量了ip偏移量=当前ip-网络号ip这里的具体代码我就不再展示了。...当你写这部分代码时,最好用我这章源码上的根文件系统,因为原始的根文件系统其实是不包含ifconfig,ping命令的,到时候不好调试路由以及测试网络联通信,源码上的根文件系统我把这两个命令都下载好了。...: cidr,}// 在容器的网络命名空间内配置路由信息if err = netlink.RouteAdd(defaultRoute); err !...答案是采用setns系统调用,setns系统调用可以让当前线程进程进入指定的命名空间内部,这段逻辑是在上述enterContainerNetns方法中,解释如下:func enterContainerNetns

    32730
    领券