2016-10-09 4 views
0

私はセットアップにコードがここHow to set the IP address from C in linuxから変更されたIPアドレスは成功するか

int 
set_ip(const char *name, const char *ip) 
{ 
    struct ifreq ifr; 
    struct sockaddr_in *addr; 
    int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 

    strncpy(ifr.ifr_name, name, IFNAMSIZ); 

    ifr.ifr_addr.sa_family = AF_INET; 

    addr = (struct sockaddr_in*)&ifr.ifr_addr; 

    /* inet_pton() returns 1 on success */ 
    /* network address was successfully converted */ 
    int s; 
    s = inet_pton(AF_INET, ip, &addr->sin_addr); 
    if (s <= 0) { 
    if (s == 0) 
     fprintf(stderr, "Set IP %s not in presentation format\n", ip); 
    else 
     perror ("inet_pton"); 
    exit (EXIT_FAILURE); 
    } 

    ioctl(fd, SIOCSIFADDR, &ifr); 

    ioctl(fd, SIOCGIFFLAGS, &ifr); 
    strncpy(ifr.ifr_name, name, IFNAMSIZ); 
    ifr.ifr_flags |= (IFF_UP | IFF_RUNNING); 

    ioctl(fd, SIOCSIFFLAGS, &ifr); 
    return 0; 
} 

をこのコードを使用できません。

私の質問は

がどのように成功したかどうか、IPアドレスの変更を知っているのですか? ioctlの戻り値は常に0です。

$ uname -a 
Linux DMA1 4.4.0-38-generiC#57-Ubuntu SMP Tue Sep 6 15:42:33 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 

私は何時間もグーグルで試しましたが、解決策は見つかりませんでした。だから私はここに私の質問を投稿して、専門家に尋ねる。事前に感謝

+0

を取得します。 –

+0

@NominalAnimal IPアドレスを192.168.1.abc、ioctlに0を返すように設定することもできます。 –

+0

@NominalAnimalまず、inet_ptonの名前を確認する必要があります。 –

答えて

0

以下、あなたのすべてをありがとう、あなたの専門家によって提案されたソリューションです:

#include <stdio.h> 
#include <stdlib.h> 
#include <ifaddrs.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <net/if.h> 
#include <net/route.h> // struct rtentry 
#include <sys/ioctl.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <unistd.h> 

int 
set_addr (const char *name, const char *ip, unsigned long request) 
{ 
    struct ifreq ifr; 
    struct sockaddr_in *addr; 
    int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 

    strncpy(ifr.ifr_name, name, IFNAMSIZ); 
    ifr.ifr_addr.sa_family = AF_INET; 
    addr = (struct sockaddr_in*)&ifr.ifr_addr; 

    // inet_pton() returns 1 on success 
    // network address was successfully converted 
    int s; 
    s = inet_pton(AF_INET, ip, &addr->sin_addr); 
    if (s <= 0) { 
    if (s == 0) 
     fprintf(stderr, "Set IP %s not in presentation format\n", ip); 
    else 
     perror ("inet_pton"); 
    exit (EXIT_FAILURE); 
    } 

    if (ioctl(fd, request, &ifr) != 0) { // SIOCSIFADDR 
    perror ("ioctl"); 
    exit (EXIT_FAILURE); 
    } 

    ioctl(fd, SIOCGIFFLAGS, &ifr); 

    strncpy(ifr.ifr_name, name, IFNAMSIZ); 
    ifr.ifr_flags |= (IFF_UP | IFF_RUNNING); 
    ioctl(fd, SIOCSIFFLAGS, &ifr); 
    return 0; 
} 

は、あなたのMakefileや、コマンドラインで次のコマンドを使用してroot権限でプログラムを付与することを忘れないでください:

$ sudo chown root your_program 
$ sudo chmod a+xs your_program 

そうでない場合は、 ``のioctl(FD、SIOCSIFADDR、&IFR)の戻り値をチェックすることによって、エラーメッセージioctl: Operation not permitted

関連する問題