gethostbyname 用法,高手一定要帮忙看看

gethostbyname 用法,高手一定要帮忙看看,第1张

使用这个东西,首先要包含2个头文件:

#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


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/465597.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-05
下一篇2023-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存