计算机名和IP地址互换

类别:编程语言 点击:0 评论:0 推荐:

计算机名和IP地址互换

 

作者 张志强

 

1.   引言

我们在网络编程中经常会碰到知道某计算机的机器名需要得到IP地址的情况。或则知道计算机的IP地址,但需要知道其机器名的情况。这都可以采用套接字实现。为了更好的方便大伙,作者就在这里做一个简单的介绍。

2.   相关函数

l          inet_addr

原型:unsigned long inet_addr(const char   FAR *cp);

参数:cp,输入参数,计算机的IP地址

返回:in_addr结构的地址

l          inet_ntoa

原型:char FAR * inet_ntoa(struct in_addr in);

参数:in,输入参数,in_addr结构

返回:计算的的名字

l          gethostbyaddr

原型:struct HOSTENT FAR * gethostbyaddr(const char FAR *addr,int len,int type);

参数:addr,输入参数,计算机地址

            len,输入参数,地址长度

            type,输入参数,地址类型

返回:主机信息

l          gethostbyname

原型:struct hostent FAR *gethostbyname(const char FAR *name );

参数:name,计算机名

返回:计算机信息

3.    IP地址到计算机名

// Function name   : GetHostName

// Description           : 通过IP地址得到机器名

// Return type                : int 机器名字符串长度

// Argument         : char * addr ip地址,例如192.168.1.3

// Argument         : char * name 机器名

int GetHostName(char * addr,char * name)

{

unsigned int node=inet_addr(addr);

if(node==INADDR_NONE)

           return -1;

WORD ver=MAKEWORD(2,2);

WSADATA wsaData;

if(WSAStartup(ver,&wsaData)!=0)//启动WinSock

           return -1;

struct hostent * phost=gethostbyaddr((char *)&node,4,AF_INET);//得到机器信息

if(!phost)

           return -1;

int len=strlen(phost->h_name);

memcpy(name,phost->h_name,len);

return strlen(name);

}

4.   计算机名到IP地址

// Function name   : GetHostIP

// Description           : 得到机器的IP地址

// Return type                : int ip地址字符串的长度

// Argument         : const char * name 机器名,如:zhangzhiqiang

// Argument         : char * ip [out]机器的IP地址

int GetHostIP(const char * name,char * ip)

{

WSADATA wsaData;

if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)        

{

           TRACE("启动套接字错误!\n");

           return false;

}

hostent * host=gethostbyname(name);   

if(!host)

           return -1;

struct sockaddr_in mac;

mac.sin_family=AF_INET;  

memcpy(&mac.sin_addr,host->h_addr_list[0],host->h_length);

//得到实际的IP地址

char * ipaddr=inet_ntoa(mac.sin_addr);

if(!ip)

           return -1;

memcpy(ip,ipaddr,strlen(ipaddr));

return strlen(ipaddr);

}

5.   小结

本文提到的方法用的是socket编程,代码稍做修改即可应用于Linux等支持socket的环境中。本文采用的代码均在Windows 2000机器上测试通过。

6.   随想

其实这只是一个很小的技巧而已,对于熟悉它的人来说再简单不过了。但对于接触网络编程很少或刚开始学习网络编程的人来说,确实能够有所帮助。我把它发表出来也希望像我一样的程序员能够减少一些摸索的时间而已。

本文地址:http://com.8s8s.com/it/it24955.htm