Chinaunix首页 | 论坛 | 博客
  • 博客访问: 519607
  • 博文数量: 398
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 14
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-21 16:02
个人简介

嵌入式屌丝

文章分类

全部博文(398)

文章存档

2013年(398)

我的朋友

分类: LINUX

2013-08-21 17:07:24

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




阅读(3405) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~