//参数:
ipbuf :存放得到的IP地址列表的数组,实际大小由bufcount指定。
bufcount:想要得到的IP地址列表的个数。
#ifdef _WIN32
#include <winsock2.h>
#include <Ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <arpa/inet.h>
#include <unistd.h>
#endif
int getselfiplist(unsigned long ipbuf[],int bufcount)
{
int i,count=0;
#ifdef _WIN32
char hostname[128];
struct hostent* inaddrs;
if(gethostname(hostname,128)==0)
{
inaddrs=gethostbyname(hostname);
if(inaddrs)
{
count=inaddrs->h_length/sizeof(in_addr);
if(count>bufcount)count=bufcount;
for(i=0;i<count;i++)
{
ipbuf[i]=*(unsigned long*)inaddrs->h_addr_list[i];
}
}
}
#else
int sock;
struct sockaddr_in sin;
struct ifreq ifr;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock>=0)//!<0
{
if(bufcount>100)bufcount=100;
for(i=0;i<bufcount;i++)
{
sprintf(ifr.ifr_name,"eth%d",i);
if(ioctl(sock,SIOCGIFADDR,&ifr)<0) break;
::memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
ipbuf[count++]=sin.sin_addr.s_addr;
}
close(sock);
}
#endif
return count;
}
此博客提供了一个跨平台获取本地IP地址列表的代码。代码通过判断是Windows还是Linux系统,使用不同的头文件和函数来实现。在Windows下利用winsock2相关函数,Linux下则使用sys/socket等相关函数,最终将获取到的IP地址存于数组中。
2312

被折叠的 条评论
为什么被折叠?



