我想從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