在介绍如何获取机器名&本机IP之前,先了解一下几个概念
1、hostent 域名结构体
struct hostent {
char FAR * h_name; /* official name of host */
char FAR * FAR * h_aliases; /* alias list */
short h_addrtype; /* host address type */
short h_length; /* length of address */
char FAR * FAR * h_addr_list; /* list of addresses */
#define h_addr h_addr_list[0] /* address, for backward compat */
};
2、gethostname()函数:返回本地主机的标准主机名。
gethostname(
__out_bcount(namelen) char FAR * name,
IN int namelen
);
该函数把本地主机名存放入由name参数指定的缓冲区中。返回的主机名是一个以NULL结束的字符串。主机名的形式取决于Windows Sockets实现-它可能是一个简单的主机名,或者是一个域名。然而,返回的名字必定可以在gethostbyname()和WSAAsyncGetHostByName()中使用。
如果没有错误发生,gethostname()返回0。否则它返回SOCKET_ERROR。应用程序可以通过WSAGetLastError()来得到一个特定的错误代码。
3、gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针
gethostbyname(
__in const char FAR * name
);
如果没有错误发生,gethostbyname()返回如上所述的一个指向hostent结构的指针,否则,返回一个空指针。应用程序可以通过WSAGetLastError()来得到一个特定的错误代码。
4、inet_ntoa() :将网络地址转换成“.”点隔的字符串格式
inet_ntoa(
IN struct in_addr in
);
5、重点来了,直接附上代码吧
void getHostAddress {
hostent *host;
char hostName[128];
gethostname(hostName,128);
host=gethostbyname(hostName);
CString strIPaddr;
strIPaddr = inet_ntoa(*(struct in_addr*)host->h_addr_list[0]);
}
6、如果本地IP不唯一呢
void getHostAddress {
char szHostName[128];
if (gethostname(szHostName,128) == 0)
{
struct hostent *pHost;
int i;
pHost=gethostbyname(szHostName);
for(i=0;pHost!=NULL&&pHost->h_addr_list[i]!=NULL;i++)
{
char str[100];
char addr[20];
int j;
LPSTR psz=inet_ntoa(*(struct in_addr *)pHost->h_addr_list[i]);
}
}
}