易网时代-编程资源站
Welcome
微信登录
编程资源
图片资源库
蚂蚁家优选
PDF转换器
软件资源
软件开发
、
小程序制作
、
系统集成与运维
、
空间租用
、
硬件开发
、
视频监控
、
技术咨询与支持
——联系电话:0311-88999002/88999003
首页
/
操作系统
/
Linux
/
GATEWAY获取与设置(Linux C)
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <string.h>
#include <net/route.h>
#include <unistd.h>
#include <stdio.h>
int
set_gateway(unsigned
long
gw)
{
int
skfd;
struct
rtentry rt;
int
err;
skfd = socket(PF_INET, SOCK_DGRAM, 0);
if
(skfd < 0)
return
-1;
/* Delete existing defalt gateway */
memset(&rt, 0,
sizeof
(rt));
rt.rt_dst.sa_family = AF_INET;
((
struct
sockaddr_in *)&rt.rt_dst)->sin_addr.s_addr = 0;
rt.rt_genmask.sa_family = AF_INET;
((
struct
sockaddr_in *)&rt.rt_genmask)->sin_addr.s_addr = 0;
rt.rt_flags = RTF_UP;
err = ioctl(skfd, SIOCDELRT, &rt);
if
((err == 0 || errno == ESRCH) && gw) {
/* Set default gateway */
memset(&rt, 0,
sizeof
(rt));
rt.rt_dst.sa_family = AF_INET;
((
struct
sockaddr_in *)&rt.rt_dst)->sin_addr.s_addr = 0;
rt.rt_gateway.sa_family = AF_INET;
((
struct
sockaddr_in *)&rt.rt_gateway)->sin_addr.s_addr = gw;
rt.rt_genmask.sa_family = AF_INET;
((
struct
sockaddr_in *)&rt.rt_genmask)- >sin_addr.s_addr = 0;
rt.rt_flags = RTF_UP | RTF_GATEWAY;
err = ioctl(skfd, SIOCADDRT, &rt);
}
close(skfd);
return
err;
}
int
get_gateway(unsigned
long
*p)
{
FILE
*fp;
char
buf[256];
// 128 is enough for linux
char
iface[16];
unsigned
long
dest_addr, gate_addr;
*p = INADDR_NONE;
fp = fopen(
"/proc/net/route"
,
"r"
);
if
(fp == NULL)
return
-1;
/* Skip title line */
fgets(buf,
sizeof
(buf), fp);
while
(fgets(buf,
sizeof
(buf), fp)) {
if
(sscanf(buf,
"%s %lX %lX"
, iface, &dest_addr, &gate_addr) != 3 ||
dest_addr != 0)
continue
;
*p = gate_addr;
break
;
}
fclose(fp);
return
0;
}
收藏该网址
版权所有©石家庄振强科技有限公司2024
冀ICP备08103738号-5
网站地图