计算机名和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.   随想

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值