我想使用 UNIX 网络 api 获取有关路由表的一些信息。为此,我正在使用路由套接字并使用 rt_msghdr 结构向内核发送请求,据我所知,该结构在 net/route.h 中定义。操作系统的版本是:
Linux version 4.14.0-kali3-amd64 (devel@kali.org) (gcc version 7.2.0 (Debian 7.2.0-18)) #1 SMP Debian 4.14.12-2kali1 (2018-01-08).
不幸的是,在我系统的 route.h 文件中没有 rt_msghdr 结构的定义。我该如何解决? 真的谢谢你,对不起我的英语
最佳答案
struct rt_msghdr 来自 BSD。 如果您使用的是 Linux,请使用 struct msghdr 和 struct nlmsghdr。 以下示例显示了它们的头文件以及如何使用它们。
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int raw_socket_test()
{
/* See https://www.linuxjournal.com/article/7356 for more details */
int sock_r;
struct sockaddr_nl src_sa; /* local (source) socket address */
struct sockaddr_nl dst_sa;
int len;
char buf[4096];
struct iovec iov = { buf, sizeof(buf) };
struct msghdr msg = { &dst_sa, sizeof(dst_sa), &iov, 1, NULL, 0, 0 }; /* struct rt_msghdr message; in BSD */
struct nlmsghdr *nlh;
sock_r = socket(AF_NETLINK,SOCK_RAW,NETLINK_ROUTE); /* sock_r = socket(AF_ROUTE,SOCK_RAW,0); in BSD */
if(sock_r<0) {
perror("socket");
return -1;
}
memset(&src_sa, 0, sizeof(src_sa));
src_sa.nl_family = AF_NETLINK;
src_sa.nl_groups = RTMGRP_LINK|RTMGRP_IPV4_ROUTE;
if (bind(sock_r,(struct sockaddr *)&src_sa,sizeof(src_sa)) < 0) {
perror("bind");
close(sock_r);
return -1;
}
while (1) {
len = recvmsg(sock_r,&msg,0); /* Unplug Ethernet cable to get a message. */
if (len < 0 ) {
perror("recvmsg");
close(sock_r);
return -1;
}
printf("len : %d\n",len);
nlh = (struct nlmsghdr *)buf;
printf("nlmsg_type: %d\n",nlh->nlmsg_type);
if (nlh->nlmsg_type == RTM_DELROUTE) {
break;
}
}
close(sock_r);
return 0;
}
关于c - 找不到 rt_msghdr 的结构定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49964279/