#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
不是!原先这个网卡有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
网上查了一下:
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
抱歉我废话了。。。
#7
#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 直接去配置就可以了!
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
不是!原先这个网卡有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
网上查了一下:
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
抱歉我废话了。。。
#7
#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 直接去配置就可以了!
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这个调试工具得到的结果。