C 从用户空间读取路由表

C 从用户空间读取路由表,c,linux,routing,linux-kernel,C,Linux,Routing,Linux Kernel,我想在用户空间中找到数据包的路由。我有dst ip,我想读取内核表,所以它会根据当前的ip路由给我结果。在C语言中有没有这样做的方法?通过nlmsg询问内核看起来是合法的,在过去对我很有效 当时我从这个答案开始: 您可以执行以下操作以获取接口索引: 首先,创建到目标的UDP套接字: int fd = socket(AF_INET, SOCK_DGRAM, 0); struct sockaddr_in in; in.sin_family = AF_INET; in.sin_port = hto

我想在用户空间中找到数据包的路由。我有dst ip,我想读取内核表,所以它会根据当前的ip路由给我结果。在C语言中有没有这样做的方法?

通过nlmsg询问内核看起来是合法的,在过去对我很有效

当时我从这个答案开始:


您可以执行以下操作以获取接口索引:

首先,创建到目标的UDP套接字:

int fd = socket(AF_INET, SOCK_DGRAM, 0);

struct sockaddr_in in;

in.sin_family = AF_INET;
in.sin_port = htons(1234);
in.sin_addr.s_addr = inet_addr("1.2.3.4");
connect(fd, (struct sockaddr *)&in, sizeof(struct sockaddr_in));
然后,调用
getsockname()
确定此套接字的传出接口的接口地址:

int inlen = sizeof(in);
getsockname(fd, (struct sockaddr *)&in, &inlen);
现在,获取所有系统接口结构并查找正确的接口地址:

struct ifaddrs *ifa, *ifap;

getifaddrs(&ifa);
ifap = ifa;
char *ifname = NULL;
while (ifa) {
   if (((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr ==
       in.sin_addr.s_addr) {
      ifname = strdup(ifa->ifa_name);
      break;
   }
   ifa = ifa->ifa_next;
}
freeifaddrs(ifap);
最后,获取接口名称的接口索引:

struct ifreq iface;

strncpy(iface.ifr_name, interface, IFNAMSIZ);
iface.ifr_name[IFNAMSIZ-1] = 0;
int len = sizeof(iface);
ioctl(fd, SIOCGIFINDEX, &iface, &len);

int ifindex = iface.ifr_ifindex;

看起来有点复杂,但独立于netlink(这也不容易)。

是的,在C中有一种方法可以做到这一点。如果你展示了你的尝试,以及你在这方面遇到了什么问题,肯定会有人向你展示如何解决问题。你到底想要什么结果?下一跳IP地址,传出接口,目标MAC地址?事实上我想要所有这些,但主要是传出接口索引