C プログラムからネットワーク インターフェイスの IP アドレスを設定しようとしています。ioctl()
周りを見回したところ、 andを使用して実行できることがわかりましたinet_pton()
。私の問題は、struct ifreq
変換されたアドレスをどこに保存する必要があるのか わからないことです。エラーが発生し続けioctl() - invalid argument
ます。
私は特に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
、どの場所に配置する必要があるかを正確に把握することはできません。アドレス変換にも使用してみifr.ifr_addr
ましたが、どちらもうまくいきませんでした。
編集:ルートとしてプログラムを実行しています。
どんな助けでも大歓迎です。さらにコードやデバッグ出力を投稿する必要がある場合はお知らせください。
ありがとう