int getipaddr(char * buf, int len)
{
int i, j, num;
int s = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
struct ifconf ifc;
struct ifreq *ifr;
char tmpbuf[512];
unsigned int mask;
int ret = -1;
struct sockaddr_in *tmp; ifc.ifc_len = 512;
ifc.ifc_buf = tmpbuf;
if(ioctl(s, SIOCGIFCONF, &ifc) < 0)
{
printf("ioctl(SIOCGIFCONF): %s", strerror(errno));
close(s);
return ret;
}
num = ifc.ifc_len / sizeof(struct ifreq);
ifr = ifc.ifc_req;
printf("interface num: %d", num);
for (j=0; j < num; j++)
{
if(ioctl(s, SIOCGIFFLAGS, ifr, sizeof(struct ifreq)) < 0)
{
printf("ioctl(SIOCGIFFLAGS): %s", strerror(errno));
continue;
}
tmp = (struct sockaddr_in*)&ifr->ifr_addr;
printf("IP: %s", inet_ntoa(tmp->sin_addr));
if(((ifr->ifr_flags & IFF_LOOPBACK) == 0) && (ifr->ifr_flags & IFF_UP))
memcpy(&addr, &(ifr->ifr_addr), sizeof(struct sockaddr_in));
else
{
printf("WARN: IFF_LOOPBACK");
continue;
} if(ioctl(s, SIOCGIFNETMASK, ifr, sizeof(struct ifreq)) < 0)
{
printf("ioctl(SIOCGIFNETMASK): %s", strerror(errno));
continue;
}
if(!inet_ntop(AF_INET, &addr.sin_addr, buf, len))
{
printf("ERROR: inet_ntop(): %s\n", strerror(errno));
close(s);
break;
}
ret = 0; memcpy(&addr, &ifr->ifr_netmask, sizeof(struct sockaddr_in));
mask = ntohl(addr.sin_addr.s_addr);
for (i = 0; i < 32; i++)
{
if ((mask >> i) & 1)
break;
}
mask = 32 - i;
if (mask)
{
i = strlen(buf);
snprintf(buf+i, len-i, "/%u", mask);
}
break;
}
close(s);
printf("DEBUG--getipaddr addr: %s\n", buf); return(ret);
}以上代码在android 4.0上面运行,输出的ip地址全部是127.0.0.1,手机已经连上wifi并且能上网。
这个问题在android2.3上面并没有出现过,不知道哪位可以帮忙看一下这是什么问题?