- 论坛徽章:
- 0
|
我知道在用户态可以通过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;
}
|
|