将用到以下结构和函数:
在net/route.h中:
struct rtentry
{
......
struct sockaddr rt_dst; /* Target address. */
struct sockaddr rt_gateway; /* Gateway addr (RTF_GATEWAY). */
struct sockaddr rt_genmask; /* Target network mask (IP). */
unsigned short int rt_flags;
......
};
`函数声明:
int set_gateway ( const char * gateway )
`代码:
struct rtentry rt;
struct sockaddr_in sin;
int skfd = -1;
/* 结构初始化 */
memset ( &rt, 0, sizeof ( struct rtentry ));
memset ( &sin, 0, sizeof ( struct sockaddr_in ));
sin.sin_family = AF_INET;
sin.sin_port = 0;
if ( inet_aton ( gateway, &sin.sin_addr ) < 0 )
{
printf ( "inet_aton error\n" );
return -1;
}
memcpy ( &rt.rt_gateway, &sin, sizeof ( sockaddr_in ));
(( struct sockaddr_in * ) &rt.rt_dst )->sin_family = AF_INET;
(( struct sockaddr_in * ) &rt.rt_genmask )->sin_family = AF_INET;
rt.rt_flags = RTF_GATEWAY;
skfd = socket ( AF_INET, SOCK_DGRAM, 0 );
if ( skfd < 0 )
{
printf ( "socket error\n" );
return -1;
}
/* 设置系统gaetway */
if ( ioctl ( skfd, SIOCADDRT, &rt ) < 0 )
{
printf ( "ioctl error\n" );
close ( skfd );
return -1;
}
close ( skfd );
return 0;
设置网关路由
本文介绍如何使用C语言通过ioctl函数设置Linux系统的网关路由。首先初始化rtentry结构体,并利用inet_aton函数将字符串形式的IP地址转换为二进制形式,接着设置rtentry结构体中的目标地址、网关地址及标志位等字段。最后通过socket和ioctl系统调用完成网关路由的设置。
5182

被折叠的 条评论
为什么被折叠?



