我想从C程序中设置网络接口的IP地址。我环顾四周,发现我可以使用ioctl()
和inet_pton()
。我的问题是,我无法弄清楚struct ifreq
我应该存储转换后的地址。我一直在收到ioctl() - invalid argument
错误。如何使用inet_pton和结构ifreq从C程序设置IP地址
我特别看过例子How to set the IP address from C in linux。这表示我们可以将ifr.ifr_addr
转换为struct sockaddr_in
。但是,在进行地址转换之后,ioctl()
失败,参数错误无效。
以下是代码:
280 void setip (int fd) {
281
282 struct ifreq ifr;
283 struct sockaddr_in * addr;
284 int stat;
285
286 strcpy(ifr.ifr_name, in.dev.device); // in.dev.device = tun2
287 addr = (struct sockaddr_in *) &ifr.ifr_addr;
288
289 addr->sin_family = AF_INET;
290
291 stat = inet_pton(addr->sin_family, in.dev.ip_addr, &addr->sin_addr); // in.dev.ip_addr = "100.0.0.10"
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 /* This is just to test if address conversion happened properly */
302 char buff[BUFF_SIZE];
303 char * foo;
304 foo = inet_ntop(AF_INET, &addr->sin_addr, buff, BUFF_SIZE);
305 if (foo == NULL)
306 raise_error("inet_ntop()");
307 else
308 printf("main = %s, addr = %s\n",in.dev.ip_addr, buff);
309
310 if (ioctl(fd, SIOCSIFADDR, &ifr, sizeof(ifr)) == -1)
311 raise_error("ioctl() - SIOCSIFADDR");
312 }
编辑:raise_error
功能是:
void raise_error (const char * msg) {
perror(msg);
exit(1);
}
输出我得到的是:
main = 100.0.0.10, addr = 100.0.0.10
ioctl() - SIOCSIFADDR: Invalid argument
我猜转换的地址也越来越放置在struct ifreq
错误的位置,但我无法数字o确切地说它应该放置在什么位置。 我也尝试使用ifr.ifr_addr
进行地址转换,但是这也不起作用。
编辑:我正在以root身份运行程序。
任何帮助将不胜感激。请让我知道是否需要发布更多代码或调试输出。
感谢
嗨,感谢您的回复, 我正在运行该程序作为根,raise_error在其他情况下工作正常。我已通过检查由raise_error输出的相应errno手册中给出的错误来确认这一点。 请让我知道如果我在这里失去了一些东西。 – aoak
@aoak用'eth0'尝试它可能tun设备是不同的... – iabdalkader
我能够设置eth0的ip地址,但不能用于tun设备。任何想法如何我可以做tun设备? 谢谢 – aoak