c - 找不到 rt_msghdr 的结构定义

标签 c linux networking routes

我想使用 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/

相关文章:

c - 如何在 Linux 上使用 C 语言在多线程中使用互斥量

linux - 如何从用户空间应用程序(Linux、C)中获取 CPU 核心编号?

linux - 如何将不同的内容文件从一个目录复制到另一个目录?

linux - 删除换行符?使用 awk 吗?

iphone - 如何在 MKNetworkKit 或 MKNetworkEngine 中禁用缓存?

c++ - 暂时删除互斥句柄

c - 为什么在macOS上用clang -O2编译C程序会出现 "empty"循环导致总线错误?

c++ - Windows 上的非阻塞套接字在 send() 调用后不会返回

c - C 中的位掩码 - 如何获取字节的第一位?

c - 接受的套接字上的“错误文件描述符”错误