route: SIOCADDRT: File exists 问题

     在设置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代码有问题?革命尚未成功啊,明天继续...




阅读(2126) | 评论(1) | 转发(1) |
0

上一篇:巧用backtrace系列函数

下一篇:一个超级宏

相关热门文章
  • linux 常见服务端口
  • 【ROOTFS搭建】busybox的httpd...
  • xmanager 2.0 for linux配置
  • 什么是shell
  • linux socket的bug??
  • 系统提供的库函数存在内存泄漏...
  • 初学UNIX环境高级编程的,关于...
  • chinaunix博客什么时候可以设...
  • 一个访问量较大网站的服务器。...
  • 收音机驱动与v4l2架构的关系,...
给主人留下些什么吧!~~

hereShirley2014-04-03 12:27:11

请问这个问题您后来解决了吗

回复 | 举报
评论热议

你可能感兴趣的:(LINUX)