2013-07-27 37 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

相關問題