gpt4 book ai didi

c - 如何通过C程序设置tun设备的IP地址并设置link UP

转载 作者:行者123 更新时间:2023-12-03 22:33:33 25 4
gpt4 key购买 nike

我正在编写一个使用 Linux tun 设备进行隧道传输的 C 程序。我正在创建一个 tun 设备,使用 ioctl() 设置其所有者、组和持久性调用。但是,为了进行隧道传输,我需要为设备设置 IP 地址并设置链接。我目前正在使用

# ip addr add
# ip link set

我想设置地址,掩码并将链接设置为 up .有没有什么办法可以通过程序做到这一点而不调用 ip命令?

我尝试使用 ioctl()SIOCSIFADDR命令,但它不适用于 tun 设备,适用于 eth0 .我收到错误 ioctl() - Invalid argument .

以下是适用于 eth0 的代码但不是像 tun2 这样的东西:
280 void setip (int fd) {
281
282 struct ifreq ifr;
283 struct sockaddr_in addr;
284 int stat;
285
286 memset(&ifr, 0, sizeof(ifr));
287 memset(&addr, 0, sizeof(addr));
288 strncpy(ifr.ifr_name, in.dev.device, IFNAMSIZ); // device name: eg. tun2
289
290 addr.sin_family = AF_INET;
291 stat = inet_pton(addr.sin_family, in.dev.ip_addr, &addr.sin_addr); // ip string
292 if (stat == 0)
293 raise_error("inet_pton() - invalid ip");
294 if (stat == -1)
295 raise_error("inet_pton() - invalid family");
296
297 if (stat == 1);
298 else
299 raise_error("inet_pton()");
300
301 ifr.ifr_addr = *(struct sockaddr *) &addr;
302 /* This is just to test if address conversion happened properly */
303 char buff[BUFF_SIZE];
304 char * foo;
305 foo = inet_ntop(AF_INET, &addr.sin_addr, buff, BUFF_SIZE);
306 if (foo == NULL)
307 raise_error("inet_ntop()");
308 else
309 printf("main = %s, addr = %s\n",in.dev.ip_addr, buff);
310
311 if (ioctl(fd, SIOCSIFADDR, (caddr_t) &ifr) == -1)
312 raise_error("ioctl() - SIOCSIFADDR");
313 }

我搜索了为 tun 设备执行此操作的方法,但找不到任何方法。我必须使用的所有帖子 ipifconfig或类似的东西。

有没有办法通过程序做到这一点?
谢谢

最佳答案

我解决了这个问题。如果是 eth0 , 我使用套接字描述符作为 ioctl() 的参数, 在 tun 设备的情况下,我使用 tun 设备描述符。我也创建了一个套接字以用于 tun 设备和 ioctl()工作。以下是代码:

280 void setip (int fd) {
281
282 struct ifreq ifr;
283 struct sockaddr_in addr;
284 int stat, s;
285
286 memset(&ifr, 0, sizeof(ifr));
287 memset(&addr, 0, sizeof(addr));
288 strncpy(ifr.ifr_name, in.dev.device, IFNAMSIZ);
289
290 addr.sin_family = AF_INET;
291 s = socket(addr.sin_family, SOCK_DGRAM, 0);
292 stat = inet_pton(addr.sin_family, in.dev.ip_addr, &addr.sin_addr);
293 if (stat == 0)
294 raise_error("inet_pton() - invalid ip");
295 if (stat == -1)
296 raise_error("inet_pton() - invalid family");
297
298 if (stat == 1);
299 else
300 raise_error("inet_pton()");
301
302 ifr.ifr_addr = *(struct sockaddr *) &addr;
303 /* This is just to test if address conversion happened properly */
304 char buff[BUFF_SIZE];
305 char * foo;
306 foo = inet_ntop(AF_INET, &addr.sin_addr, buff, BUFF_SIZE);
307 if (foo == NULL)
308 raise_error("inet_ntop()");
309 else
310 printf("main = %s, addr = %s\n",in.dev.ip_addr, buff);
311
312 //if (ioctl(fd, SIOCSIFADDR, (caddr_t) &ifr) == -1)
313 if (ioctl(s, SIOCSIFADDR, (caddr_t) &ifr) == -1)
314 raise_error("ioctl() - SIOCSIFADDR");
315 }

感谢朱塞佩佩斯的回复:)

关于c - 如何通过C程序设置tun设备的IP地址并设置link UP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17900459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com