C语言 从用户空间读取路由表



我想在用户空间中找到数据包的路由。我有 dst ip,我想读取内核表,所以它会根据当前的 ip 路由 cfg 给我结果。有什么方法可以在 C 中做到这一点吗?

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

首先,创建一个到目标的 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(这也不容易(。

通过 nlmsg 询问内核看起来是合法的,并且过去对我有用。

我当时从这个答案开始:

https://stackoverflow.com/a/27331273/6232305

最新更新