c - 如何更改默认网关 vie C
问题描述
我正在尝试用 C 编写一个程序来更改默认网关。
我已经运行了以下代码:Linux:如何从 C 设置默认路由? 这里提供的代码不像我想象的那样工作。它在旁边添加了一个具有高度量标准的默认网关。我读到了公制数字,但这显然不是我的目标。我想用我自己的一个交换当前的默认地址。
如果您添加一些代码,它附近的解释也将不胜感激,因为这是第一次使用 ioctl。不太熟悉它的工作原理或为什么需要添加这么多东西来定义它。
PS 请避免任何需要我打开文件或字符串操作的响应。先感谢您
解决方案
这是一段定义默认网关的代码
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <net/route.h>
#include <sys/types.h>
#include <sys/ioctl.h>
int main(char** args) {
int sockfd;
struct rtentry route;
struct sockaddr_in *addr;
int err = 0;
// create the socket
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)))<0){
perror("socket");
exit(1);
}
memset(&route, 0, sizeof(route));
addr = (struct sockaddr_in*) &route.rt_gateway;
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = inet_addr("192.168.2.1");
addr = (struct sockaddr_in*) &route.rt_dst;
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = INADDR_ANY;
addr = (struct sockaddr_in*) &route.rt_genmask;
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = INADDR_ANY;
// You need to add the interface name to the request
route.rt_flags = RTF_UP | RTF_GATEWAY;
route.rt_metric = 0;
if ((err = ioctl(sockfd, SIOCADDRT, &route)) != 0) {
perror("SIOCADDRT failed");
exit(1);
}
}
它仅使用简单的 IOCTL 概念。如果您对这些概念有疑问,我建议您查看以下链接: IOCTL 手册页
推荐阅读
- unity3d - 在 Mac 上构建 WebGL 项目时出现 Unity System.ComponentModel.Win32Exception 错误
- ios - 具有来自对象数组的字符串属性的 NSSet
- c - 是否有替代 C 中数组的范围初始化的替代方法?
- typescript - TypeScript 错误的 promise 使用回调函数的返回值解析了推断类型
- mysql - Laravel distinct/groupBy 和分页
- distributed-system - 为什么要将应用服务器拆分为读写服务器?
- javascript - 如何同步播放多个 GIF?(反应)
- android - Android 什么时候会在不破坏整个进程的情况下破坏活动?
- web - 如何从无法访问 Window 对象的服务工作者脚本刷新页面
- cplex - CPLEX/OPL 预分配决策变量