1

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ましたが、どちらもうまくいきませんでした。

編集:ルートとしてプログラムを実行しています。

どんな助けでも大歓迎です。さらにコードやデバッグ出力を投稿する必要がある場合はお知らせください。

ありがとう

4

2 に答える 2

0

raise_errormakeが前に別の関数をperror呼び出し、その呼び出しの結果が表示されていないため、間違ったエラーメッセージが表示されていると思います..テストする関数の直後にioctl常に呼び出す必要があります。perror私はあなたのコードを試してみioctl()ましたが、「ioctl(): Permission denied」で失敗しました。ルートとして実行する必要があります (サイズを渡す必要がないことにも注意してくださいifreq)

于 2013-07-27T03:28:27.657 に答える