不能直接获取本机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();
}