• 《TCP/IP网络编程》阅读笔记--域名及网络地址


    目录

    1--域名系统

    2--域名与 IP 地址的转换

    2-1--利用域名来获取 IP 地址

    2-2--利用 IP 地址获取域名

    3--代码实例

    3-1--gethostbyname()

    3-2--gethostbyaddr()


    1--域名系统

            域名系统(Domain Name System,DNS)是对 IP 地址和域名进行相互转换的系统,其核心是 DNS 服务器;

            一般来说,IP 地址比较难记且经常变化,而域名容易记且易表述,并不会轻易改变域名;(Naver 网站的 IP 地址是222.122.195.5 而其域名为 www.naver.com)

            域名是赋予服务器端的虚拟地址,并非实际地址,因此需要通过 DNS 服务器将虚拟的域名地址转换为实际的 IP 地址;

            通常,计算机会向内置的默认 DNS 服务器请求获得域名对应的 IP 地址,若默认 DNS 服务器无法解析,则默认 DNS 服务器会不断向上级 DNS 服务器询问,直至获得域名对应的 IP 地址;

    程序中使用域名的必要性:

            ① IP 地址比域名发生变更的概率要高,因此一般不会利用 IP 地址来编写程序;

            ② 域名一般不会变更,通过域名编写程序,在程序中根据域名来获取 IP 地址,再通过转换的 IP 地址接入相应的服务器,就比直接使用 IP 地址显得更为高效;

    2--域名与 IP 地址的转换

    2-1--利用域名来获取 IP 地址

    1. #include
    2. struct hostent* gethostbyname(const char* hostname);
    3. // 成功时返回 hostent 结构体地址,失败时返回 NULL 指针
    4. // hosttent结构体的定义如下:
    5. struct hostent{
    6. char* h_name;
    7. char** h_aliases;
    8. int h_addrtype;
    9. int h_length;
    10. char** h_addr_list;
    11. }

            在上述 hostent 结构体中,h_name 表示官方域名h_aliases 表示其它域名信息(因为多个域名可以访问同一主页,同一个 IP 也可以绑定多个域名);h_addrtype 表示地址族信息(例如 IPv4,则对应为 AF_INET); h_length 表示 IP 地址的长度(IPv4 则为 4,IPv6 则为 16);h_addr_list 表示已整数形式保存的 IP 地址

    2-2--利用 IP 地址获取域名

    1. #include
    2. struct hostent* gethostbyaddr(const char* addr, socklen_t len, int family);
    3. // 成功时返回 hostent 结构体变量地址值,失败时返回 NULL 指针
    4. // addr 表示函数 IP 地址信息的 in_addr 结构体指针,为了同时传递 IPv4 地址之外的其他信息,该变量的类型声明为 char 指针
    5. // len 表示向第一个参数传递的地址信息的字节数,IPv4 为 4,IPv6 为 16
    6. // family 表示传递的地址族信息,IPv4 为 AF_INET,IPv6 为 AF_INET6

    3--代码实例

    3-1--gethostbyname()

    1. // gcc gethostbyname.c -o gethostbyname
    2. // ./gethostbyname www.baidu.com
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. void error_handling(char *message){
    10. fputs(message, stderr);
    11. fputc('\n', stderr);
    12. exit(1);
    13. }
    14. int main(int argc, char *argv[]){
    15. int i;
    16. struct hostent *host;
    17. if(argc != 2){
    18. printf("Usage : %s \n", argv[0]);
    19. exit(1);
    20. }
    21. host = gethostbyname(argv[1]);
    22. if(!host){
    23. error_handling("gethost... error");
    24. }
    25. printf("Official name: %s \n", host->h_name);
    26. for(i = 0; host->h_aliases[i]; i++){
    27. printf("Aliases %d: %s \n", i+1, host->h_aliases[i]);
    28. }
    29. printf("Address type: %s \n", (host->h_addrtype == AF_INET)?"AF_INET":"AF_INET6");
    30. for(i = 0; host->h_addr_list[i]; i++){
    31. printf("IP addr %d: %s \n", i+1, inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
    32. }
    33. return 0;
    34. }

    3-2--gethostbyaddr()

    1. // gcc gethostbyaddr.c -o gethostbyaddr
    2. // ./gethostbyaddr 199.59.148.206
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. void error_handling(char *message){
    10. fputs(message, stderr);
    11. fputc('\n', stderr);
    12. exit(1);
    13. }
    14. int main(int argc, char *argv[]){
    15. int i;
    16. struct hostent *host;
    17. struct sockaddr_in addr;
    18. if(argc != 2){
    19. printf("Usage : %s \n", argv[0]);
    20. exit(1);
    21. }
    22. memset(&addr, 0, sizeof(addr));
    23. addr.sin_addr.s_addr = inet_addr(argv[1]);
    24. host = gethostbyaddr((char*) &addr.sin_addr, 4, AF_INET);
    25. if(!host){
    26. error_handling("gethost... error");
    27. }
    28. printf("Official name: %s \n", host->h_name);
    29. for(i = 0; host->h_aliases[i]; i++){
    30. printf("Aliases %d: %s \n", i+1, host->h_aliases[i]);
    31. }
    32. printf("Address type: %s \n", (host->h_addrtype == AF_INET)?"AF_INET":"AF_INET6");
    33. for(i = 0; host->h_addr_list[i]; i++){
    34. printf("IP addr %d: %s \n", i+1, inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
    35. }
    36. return 0;
    37. }

  • 相关阅读:
    OpenHarmony南向学习笔记——Hi3861+HC-SR04超声波检测
    韩老师java教程
    C++八股
    Mapfree智驾方案,怎样实现成本可控?
    ms office学习记录10:Excel㈣
    小程序也能是App中的引流神器?
    key值的应用场景
    android 指针动画转动
    基于springboot实现教师人事档案管理系统项目【项目源码+论文说明】计算机毕业设计
    冰冰学习笔记:初识环境变量
  • 原文地址:https://blog.csdn.net/weixin_43863869/article/details/132742602