忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1900 | 回复: 5

[内核入门] 请问如何在内核编程获得本机ip? [复制链接]

论坛徽章:
0
发表于 2017-11-16 11:04 |显示全部楼层
我知道在用户态可以通过ifreq结构体来获得本机ip,所以我尝试在内核用ifreq获得本机ip,可是加载进内核模块后一运行,导致内核崩溃了。代码如下:
static char *Get_local_ip(void)
{
        //static char ipstr[]="1.2.3.4";
        static struct ifreq ifr_ot;
        struct sockaddr_in getip;
        struct socket *sock;
        int ret;

        getip.sin_family=AF_INET;  
        getip.sin_port=htons(1234);  
        getip.sin_addr.s_addr=htonl(INADDR_ANY);
        
        memset(&getip,0,sizeof(getip));

        sock = (struct socket*)kmalloc(sizeof(struct socket),GFP_KERNEL);
        ret = sock_create_kern(&init_net,PF_INET,SOCK_DGRAM,0,&sock);
       ---红色部分的参数我不知道有没有问题。这个函数sock_create_kern(int sock_create_kern(struct net *net, int family, int type, int proto, struct socket **res)原型和网上的不一样,新增了第一个参数。
        if(ret < 0)
        {
                printk("sokcet creat error\n");
        }
        strcpy(ifr_ot.ifr_name,"wlan0");
        kernel_sock_ioctl(sock,SIOCSIFNAME,(unsigned long) &ifr_ot);
        
        sprintf(ipstr,"across "NIPQUAD_FMT"\n",NIPQUAD(((struct sockaddr_in*)&(ifr_ot.ifr_addr))->sin_addr));
        
        return ipstr;
}

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
发表于 2017-11-16 14:25 |显示全部楼层
红色部分是网络namespace

论坛徽章:
0
发表于 2017-11-22 09:37 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2017-11-22 16:17 |显示全部楼层
问题已解决。感谢百度。下面是代码:

论坛徽章:
0
发表于 2017-11-22 16:19 |显示全部楼层
struct net_device *pDev;
struct in_device *pdev_ipaddr=NULL;
struct in_ifaddr *pdev_ifaddr=NULL;

pDev = dev_get_by_name(&init_net,"wlan0");//get equipment pointer;
pdev_ipaddr=(struct in_device *)pDev->ip_ptr;

memset(ipaddr,0,sizeof(ipaddr));

if(pdev_ipaddr)
{
        pdev_ifaddr = (struct in_ifaddr*)pdev_ipaddr->ifa_list;
        if(pdev_ifaddr)
        {
                sprintf(ipaddr,""NIPQUAD_FMT"",NIPQUAD(pdev_ipaddr->ifa_list->ifa_local));

        }
     }

        printk("%s\n",ipaddr);

论坛徽章:
0
发表于 2017-11-22 16:22 |显示全部楼层
上面代码有一句没加上- -
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP