Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1146206
  • 博文数量: 177
  • 博客积分: 761
  • 博客等级: 上士
  • 技术积分: 1518
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-04 22:37
文章分类

全部博文(177)

文章存档

2017年(1)

2016年(3)

2015年(33)

2014年(48)

2013年(60)

2012年(32)

分类: LINUX

2012-10-10 16:12:26

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




阅读(16615) | 评论(2) | 转发(1) |
0

上一篇:巧用backtrace系列函数

下一篇:一个超级宏

给主人留下些什么吧!~~

liu5157405202014-07-21 16:55:34

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

你也有遇到?解决了否?

回复 | 举报

hereShirley2014-04-03 12:27:11

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