#include <netdb.h>
#include <sys/socket.h>
struct hostent *gethostbyname(const char *name)
这个函数的传入值是域名或者主机名,例如"www.google.com","wpc"等等。
传出值,是一个hostent的结构(如下)。如果函数调用失败,将返回NULL。
struct hostent {
char *h_name
char **h_aliases
int h_addrtype
int h_length
char **h_addr_list
}
解释一下这个结构, 其中:
char *h_name 表示的是主机的规范名。例如www.google.com的规范名其实是www.l.google.com。
char **h_aliases 表示的是主机的别名。www.google.com就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。
int h_addrtype 表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是ipv6(AF_INET6)
int h_length 表示的是主机ip地址的长度
int **h_addr_lisst 表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。所以到真正需要打印出这个IP的话,需要调用inet_ntop()。
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) :
这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中。
这个函数,其实就是返回指向dst的一个指针。如果函数调用错误,返回值是NULL。
下面是例程,有详细的注释。
#include <netdb.h>
#include <sys/socket.h>
int main(int argc, char **argv)
{
char *ptr,**pptr
struct hostent *hptr
char str[32]
/* 取得命令后第一个参数,即要解析的域名或主机名 */
ptr = argv[1]
/* 调用gethostbyname()。调用结果都存在hptr中 */
if( (hptr = gethostbyname(ptr) ) == NULL )
{
printf("gethostbyname error for host:%s\n", ptr)
return 0/* 如果调用gethostbyname发生错误,返回1 */
}
/* 将主机的规范名打出来 */
printf("official hostname:%s\n",hptr->h_name)
/* 主机可能有多个别名,将所有别名分别打出来 */
for(pptr = hptr->h_aliases*pptr != NULLpptr++)
printf(" alias:%s\n",*pptr)
/* 根据地址类型,将地址打出来 */
switch(hptr->h_addrtype)
{
case AF_INET:
case AF_INET6:
pptr=hptr->h_addr_list
/* 将刚才得到的所有地址都打出来。其中调用了inet_ntop()函数 */
for(*pptr!=NULLpptr++)
printf(" address:%s\n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)))
break
default:
printf("unknown address type\n")
break
}
return 0
楼主你好!
这个函数char FAR * inet_ntoa( struct in_addr in)
功能:将一个IP转换成一个互联网标准点分格式的字符串。
你可以这样做:
先定义个sockaddr_in p
然后给p.sin_addr.s_addr=0xfeff0032
再定义个字符指针char *a用来存放转后的字符串
最后使用a=inet_ntoa(p.sin_addr.saddr)
下面是我写的简单的测试程序:
下面是运行的结果:
提醒下:
p.sin_addr.s_addr=0xfeff0032这里可能涉及网络字节转换,需要用到ntohl()函数,具体情况得看你的这个0xfeff0032到底是网络字节的ip整数,还是你自己主机上的ip整数。我这把它看成是主机上的ip整数!
希望的回答对你有帮助!
现在一般使用inet_aton和inet_ntoa来处理网络字节和主机字节之间的转换有两个更新的函数inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6,原型如下
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst)
这个函数转换字符串到网络地址,第一个参数af是地址族,转换后存在dst中
inet_pton 是inet_addr的扩展,支持的多地址族有下列:
AF_INET
src为指向字符型的地址,即ASCII的地址的首地址(ddd.ddd.ddd.ddd格式的),函数将该地址
转换为in_addr的结构体,并复制在*dst中
AF_INET6
src为指向IPV6的地址,,函数将该地址
转换为in6_addr的结构体,并复制在*dst中
如果函数出错将返回一个负值,并将errno设置为EAFNOSUPPORT,如果参数af指定的地址族和src格式不对,函数将返回0。
函数inet_ntop进行相反的转换原型如下
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)
这个函数转换网络二进制结构到ASCII类型的地址,参数的作用和上面相同,只是多了一个参数socklen_t cnt,他是所指向缓存区dst的大小,避免溢出,如果缓存区太小无法存储地址的值,则返回一个空指针,并将errno置为ENOSPC
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)