网络编程-DNS

"本文介绍了DNS(域名服务)的工作原理,通过gethostbyname()函数将易记的域名转换为IP地址。当调用gethostbyname()并传入域名如"xuluck.com"时,它返回一个hostent结构体,从中可以获取主机的正式名称和IP地址。示例代码演示了如何使用gethostbyname()和inet_ntoa()来获取和打印IP地址。"
摘要由CSDN通过智能技术生成

DNS

域名服务(Domain Name Service)
你给它一个容易记忆的某站点的地址, 它给你 IP地址(然后你就可以使用 bind(), connect(), sendto() 或者其它函数)
例如要使用域名连接到一个网站 xuluck.com

$ telnet xuluck.com

telent可以知道连接的目的地址为”47.108.133.125“。
具体的工作过程:
可以调用函数gethostbyname():

#include <netdb.h>

struct hostent *gethostbyname(const char *name); 

返回一个指向Struct hostent的指针,此结构体的数据结构是这样的:

struct hostent

{

   char *h_name;

   char **h_aliases;

   int h_addrtype;

   int h_length;

   char **h_addr_list;

};

   #define h_addr h_addr_list[0] 

数据结构具体详见:
struct hostent:

h_name - 地址的正式名称。

h_aliases - 空字节-地址的预备名称的指针。

h_addrtype -地址类型; 通常是AF_INET。

h_length - 地址的比特长度。

h_addr_list - 零字节-主机网络地址指针。网络字节顺序。

h_addr - h_addr_list中的第一地址。
gethostbyname() 成功时返回一个指向结构体 hostent 的指针,或者 是个空(NULL) 指针。
举例使用:

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <netdb.h>

#include <sys/types.h>

#include <netinet/in.h>

int main(int argc, char *argv[])

{

   struct hostent *h;

if (argc != 2)

{

   fprintf(stderr,"usage: getip address/n");

   exit(1);

    }

if ((h=gethostbyname(argv[1])) == NULL)

{

   herror("gethostbyname");

    exit(1);

 }

printf("Host name : %s/n", h->h_name);

printf("IP Address : %s/n",inet_ntoa(*((struct in_addr *)h->h_addr)));

return 0;

 }

在使用 gethostbyname() 的时候,你不能用 perror() 打印错误信息 (因为errno 没有使用),你应该调用 herror()。
相当简单,你只是传递一个保存机器名的字符串(例如 “xuluck.com”) 给gethostbyname(),然后从返回的数据结构 struct hostent 中获取信息。

唯一也许让人不解的是输出 IP 地址信息。h->h_addr 是一个 char * , 但是inet_ntoa() 需要的是 struct in_addr。因此,我转换 h->h_addr 成 struct in_addr *,然后得到数据。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值