获取本机IP信息

75 篇文章 2 订阅
51 篇文章 0 订阅

不能直接获取本机IP信息确实挺纠结的,感觉微软应该给出这样的API接口

C++中的实现:

一般实现都需要先通过gethostname()函数获取本机的名字,然后再调用gethostbyname()函数来获取主机的信息。

gethostname()函数的说明如下:

int gethostname(char FAR *name, int namelen);

其中,name是主机的名字,是输出参数

gethostbyname函数的说明如下:

struct hostent FAR *gethostbyname(const char FAR *name);

返回结构体具体内容为:

struct hostent {
  char FAR *       h_name;
  char FAR * FAR * h_aliases;
  short            h_addrtype;
  short            h_length;
  char FAR * FAR * h_addr_list;
};

其中,h_addr_list中以数组形式存放主机的IP信息(以网络字节序保存)。一般而言,数组中第一个(即下标为0)为外网IP,第二个为内网IP

然后再调用inet_ntoa()函数转化为点分十进制形式。

char FAR * inet_ntoa(struct   in_addr in);

代码实现如下:

//获取本机的IP信息,pIP为传出参数
char * CClient::getHostIP()
{
	char hostName[32]={0};
	if(gethostname(hostName, 32)==SOCKET_ERROR)
		return NULL;
	
	hostent * pHost=gethostbyname(hostName);
	if(pHost==NULL)
		return NULL;

	return inet_ntoa(*(in_addr *)pHost->h_addr_list[0]);
}

注意:gethostname()函数和gethostbyname()函数都包含在Winsock2.h头文件中,同时增加项目连接:Ws2_32.lib

C++中的实现:

需要用到的类:

Dns类:提供简单的域名解析功能;

主要用到的两个方法:

(1)GetHostName()方法    用来获取主机名

public static string GetHostName()

(2)GetHostEntry()方法     将主机名或 IP 地址解析为 IPHostEntry 实例

public static IPHostEntry GetHostEntry(
	string hostNameOrAddress
)

IPHostEntry类:为 Internet 主机地址信息提供容器类;

主要用到属性AddressList,该属性可以用于获取或设置与主机关联的 IP 地址列表

public IPAddress[] AddressList { get; set; }

IPAddress类可以使用方法ToString()转为字符串,也可以使用方法Parse()将字符串转为IPAddress类型。

所在的命名空间:using System.Net;

实现步骤与C++中相似,都是先获取主机名,然后再通过主机名来获取主机IP

代码实现如下:

        static void Main(string[] args)
        {
            //得到主机名
            string HostName = Dns.GetHostName();

            //获得与主机关联的 IP 地址列表
            IPHostEntry IpEntry = Dns.GetHostEntry(HostName);

            Console.WriteLine("Host Name is {0}", HostName);
            for (int i = 0; i < IpEntry.AddressList.Length; i++)
            {
                string strIPAddr = IpEntry.AddressList[i].ToString();
                Console.WriteLine("Host IP is {0}", strIPAddr);
            }
            Console.ReadLine();
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值