2013-07-27 36 views
1

我想从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身份运行程序。

任何帮助将不胜感激。请让我知道是否需要发布更多代码或调试输出。

感谢

回答

0

根据mux的评论,在eth0哪些工作相同的代码。因此,我猜Tun设备是不同的,我们不能使用相同ioctl()呼吁他们。 因此,使用inet_ptonstruct ifreq代替ioctl()来设置ip地址的方式是正确的,但它不适用于tun设备。

0

我认为你所看到的错误错误消息,因为raise_error进行调用另一个函数perror之前和你看到的那个电话不是ioctl的结果..你应该总是调用perror功能之后你想测试。我试过你的代码,并ioctl()失败,“ioctl():权限被拒绝”,你需要以root身份运行(也请注意,你不需要通过ifreq的大小)

+0

嗨,感谢您的回复, 我正在运行该程序作为根,raise_error在其他情况下工作正常。我已通过检查由raise_error输出的相应errno手册中给出的错误来确认这一点。 请让我知道如果我在这里失去了一些东西。 – aoak

+0

@aoak用'eth0'尝试它可能tun设备是不同的... – iabdalkader

+0

我能够设置eth0的ip地址,但不能用于tun设备。任何想法如何我可以做tun设备? 谢谢 – aoak

相关问题