在设置linux 的ip是采用了c方式,反复设置同一个ip时系统会抛出以下信息,真令人费解!
route: SIOCADDRT: File exists以下为C修改IP地址的代码:
int set_ipaddr(UI32_T ipaddr)
{
int s;
if((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
return -1;
}
struct ifreq ifr;
bzero((char *)&ifr, sizeof(ifr));
strcpy(ifr.ifr_name,ETH_NAME);
struct sockaddr_in addr;
bzero(&addr, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
//inet_aton(ipaddr,&addr.sin_addr);//将输入字符转成网络地址
//inet_ntoa(ipaddr,&addr.sin_addr);//将输入字符转成网络地址
addr.sin_addr.s_addr=ipaddr;
memcpy((char*)&ifr.ifr_ifru.ifru_addr, (char*)&addr, sizeof(struct sockaddr_in));
if(ioctl(s, SIOCSIFADDR, &ifr) < 0)
{
close(s);
return -1;
}
close(s);
return 0;
}
于是乎跟踪一下这个信息是哪里输出的,在内核代码找到了些线索,file->f_op->unlocked_ioctl
file->f_op->unlocked_ioctl=sock_ioctl
进一步上看sock_ioctl会调用sock_do_ioctl函数,改函数会返回一个err值,因此在这些函数的地方加上打印语句,看看结果,以下是打印出来的信息,可见使用上面c代码设置同一个ip地址后会出现-17再输出 route: SIOCADDRT: File exists 信息
sock_do_ioctl 0
sock_ioctl
0
sock_do_ioctl -17
sock_ioctl
-17
sock_do_ioctl 0
sock_ioctl
0
route: SIOCADDRT: File exists
sock_do_ioctl 0
sock_ioctl
0
跟踪到这里还没有找到数据此信息的源头,通过目录下的error.c文件我找到了该信息的字符串,改字符串存在了hash表中,以便后续输出使用。改值EEXIST 为 17,似乎和-17有一定的关系
今天就找到了这些线索,。但是我通过ifconfig命令来反复设定通一个ip地址为啥没有抛出那条信息呢?难道是C代码有问题?革命尚未成功啊,明天继续...
阅读(3334) | 评论(0) | 转发(0) |