C语言设置网卡的第二个IP

时间:2023-01-07 11:24:11
#include <stdio.h>
#include <dirent.h>
#include <iconv.h>
#include <openssl/md5.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <assert.h>
#include <syslog.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/sysinfo.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <net/route.h>
#include <linux/rtnetlink.h>
#include <net/if_arp.h>
#include <mysql/mysql.h>
#include <openssl/md5.h>

int main(int argc, char **argv)
{
        if(argc < 3)
        {
                return -1;
        }
        int fd, ret;
        struct ifreq ifr; 
        struct sockaddr_in *sin;
        char errbuf[1024] = "set ip error";

        fd = socket(AF_INET, SOCK_DGRAM, 0);
        if(fd < 0)
        {
                sprintf(errbuf, "%s", strerror(errno));
                perror("socket   error");
                return -1;     
        }
        memset(&ifr,0,sizeof(ifr)); 
        strcpy(ifr.ifr_name,argv[1]); 
        sin = (struct sockaddr_in*)&ifr.ifr_addr;     
        sin->sin_family = AF_INET;   
        sin->sin_port = 0;
        if((ret = inet_aton(argv[2],&(sin->sin_addr))) < 0)   
        {     
                sprintf(errbuf, "%s", strerror(errno));
                perror("inet_aton error");     
        }    
        if((ret = ioctl(fd,SIOCGIFFLAGS,&ifr)) < 0)   
        {     
                sprintf(errbuf, "%s", strerror(errno));
                perror("ioctl SIOCSIFFLAGS error");     
        }
        ifr.ifr_flags |= (IFF_UP | IFF_RUNNING | IFF_DEBUG);
        if((ret = ioctl(fd,SIOCSIFFLAGS,&ifr)) < 0)   
        {     
                sprintf(errbuf, "%s", strerror(errno));
                perror("ioctl SIOCSIFFLAGS error");     
        }
        close(fd);
        return 0;
}
---------------------------------------------------------------------------
编译后生成ifconfig :
【测试】./ifconfig eth0 192.168.0.28  成功
【测试】./ifconfig eth0:1 192.168.0.29
ioctl SIOCSIFFLAGS error: Cannot assign requested address
哪位大侠帮看看什么原因造成的!

10 个解决方案

#1


测试通过立刻给分!

#2


是不是要先设eth0:0

#3


引用 2 楼 hai040 的回复:
是不是要先设eth0:0


不是!原先这个网卡有ip的
我只是加上另一个ip

#4


没搞过linux
网上查了一下:
http://013416.blog.163.com/blog/static/2198689200617940540/
命令行是这样:
ifconfig eth0:0 172.20.66.2 up
ifconfig eth0:1 172.20.66.3 up

#5


我知道这么用!!我就是不明白!我代码错在什么地方了!

#6


引用 5 楼 wanglllmn 的回复:
我知道这么用!!我就是不明白!我代码错在什么地方了!

抱歉我废话了。。。

#7


C语言设置网卡的第二个IP

#8


0.001488 [b7728424] ioctl(4, SIOCSIFADDR, 0xbf869b08) = 0
0.004859 [b7728424] ioctl(4, SIOCGIFFLAGS, {ifr_name="eth0:1", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_DEBUG|IFF_RUNNING|IFF_MULTICAST}) = 0
0.000799 [b7728424] ioctl(4, SIOCSIFFLAGS, 0xbf869a0c) = 0
可以明显发现系统调用中有调用SIOCSIFADDR这个功能。
所以在上述代码中加入
 if((ret = ioctl(fd,SIOCSIFADDR,&ifr)) < 0)   
        {     
                sprintf(errbuf, "%s", strerror(errno));
                perror("ioctl SIOCSIFADDR error");    
        }
这样就可以了。
所谓eth0:1 把这个当成一个网络的interface 直接去配置就可以了!

#9


上边是我调用strace这个调试工具得到的结果。

#1


测试通过立刻给分!

#2


是不是要先设eth0:0

#3


引用 2 楼 hai040 的回复:
是不是要先设eth0:0


不是!原先这个网卡有ip的
我只是加上另一个ip

#4


没搞过linux
网上查了一下:
http://013416.blog.163.com/blog/static/2198689200617940540/
命令行是这样:
ifconfig eth0:0 172.20.66.2 up
ifconfig eth0:1 172.20.66.3 up

#5


我知道这么用!!我就是不明白!我代码错在什么地方了!

#6


引用 5 楼 wanglllmn 的回复:
我知道这么用!!我就是不明白!我代码错在什么地方了!

抱歉我废话了。。。

#7


C语言设置网卡的第二个IP

#8


0.001488 [b7728424] ioctl(4, SIOCSIFADDR, 0xbf869b08) = 0
0.004859 [b7728424] ioctl(4, SIOCGIFFLAGS, {ifr_name="eth0:1", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_DEBUG|IFF_RUNNING|IFF_MULTICAST}) = 0
0.000799 [b7728424] ioctl(4, SIOCSIFFLAGS, 0xbf869a0c) = 0
可以明显发现系统调用中有调用SIOCSIFADDR这个功能。
所以在上述代码中加入
 if((ret = ioctl(fd,SIOCSIFADDR,&ifr)) < 0)   
        {     
                sprintf(errbuf, "%s", strerror(errno));
                perror("ioctl SIOCSIFADDR error");    
        }
这样就可以了。
所谓eth0:1 把这个当成一个网络的interface 直接去配置就可以了!

#9


上边是我调用strace这个调试工具得到的结果。