使用 ioctl 以编程方式在C++中添加路由

Add route programmatically in C++ using ioctl

本文关键字:C++ 添加 路由 方式 ioctl 编程 使用      更新时间:2023-10-16

我写了一个简单的C++函数,它添加了新路由:

void addRoute()
{
int fd = socket( PF_INET, SOCK_DGRAM, IPPROTO_IP );
struct rtentry route;
memset( &route, 0, sizeof( route ) );
struct sockaddr_in *addr = (struct sockaddr_in *)&route.rt_gateway;
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = inet_addr( "192.168.20.1" );
addr = (struct sockaddr_in*) &route.rt_dst;
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = inet_addr( "10.0.0.50" );
addr = (struct sockaddr_in*) &route.rt_genmask;
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = INADDR_ANY;
route.rt_flags = RTF_UP | RTF_GATEWAY;
route.rt_metric = 0;
int rc = ioctl( fd, SIOCADDRT, &route );
cout << "rc = " << rc << endl; //rc = -1
close( fd );
}
int main()
{
addRoute();
return 0;
}

问题是 ioctl 返回 -1 (rc = -1(。我的代码有什么问题? 我从启动它。我想执行 ip 路由并看到这一行:

10.0.0.50 via 192.168.20.1 dev vpn_linux

您使用格式为a.b.c.d/32的地址屏蔽INADDR_ANY(0.0.0.0(,因此它应该使用255.255.255.255

/32 的解决方案是:

addr = (struct sockaddr_in*) &route.rt_dst;
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = inet_addr( "10.0.0.50" );
addr = (struct sockaddr_in*) &route.rt_genmask;
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = inet_addr( "255.255.255.255" );