Windows和Linux得到本机IP地址的通用函数

//参数:

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值