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

news/2024/10/17 22:14:19/

目录

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 地址

#include <netdb.h>
struct hostent* gethostbyname(const char* hostname);
// 成功时返回 hostent 结构体地址,失败时返回 NULL 指针// hosttent结构体的定义如下:
struct hostent{char* h_name;char** h_aliases;int h_addrtype;int h_length;char** h_addr_list;
}

        在上述 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 地址获取域名

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

3--代码实例

3-1--gethostbyname()

// gcc gethostbyname.c -o gethostbyname
// ./gethostbyname www.baidu.com#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>void error_handling(char *message){fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char *argv[]){int i;struct hostent *host;if(argc != 2){printf("Usage : %s <port>\n", argv[0]);exit(1);}host = gethostbyname(argv[1]);if(!host){error_handling("gethost... error");}printf("Official name: %s \n", host->h_name);for(i = 0; host->h_aliases[i]; i++){printf("Aliases %d: %s \n", i+1, host->h_aliases[i]);}printf("Address type: %s \n", (host->h_addrtype == AF_INET)?"AF_INET":"AF_INET6");for(i = 0; host->h_addr_list[i]; i++){printf("IP addr %d: %s \n", i+1, inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));}return 0;
}

3-2--gethostbyaddr()

// gcc gethostbyaddr.c -o gethostbyaddr
// ./gethostbyaddr 199.59.148.206#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>void error_handling(char *message){fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char *argv[]){int i;struct hostent *host;struct sockaddr_in addr;if(argc != 2){printf("Usage : %s <port>\n", argv[0]);exit(1);}memset(&addr, 0, sizeof(addr));addr.sin_addr.s_addr = inet_addr(argv[1]);host = gethostbyaddr((char*) &addr.sin_addr, 4, AF_INET);if(!host){error_handling("gethost... error");}printf("Official name: %s \n", host->h_name);for(i = 0; host->h_aliases[i]; i++){printf("Aliases %d: %s \n", i+1, host->h_aliases[i]);}printf("Address type: %s \n", (host->h_addrtype == AF_INET)?"AF_INET":"AF_INET6");for(i = 0; host->h_addr_list[i]; i++){printf("IP addr %d: %s \n", i+1, inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));}return 0;
}


http://www.ppmy.cn/news/1095855.html

相关文章

校园二手物品交易系统微信小程序设计

系统简介 本网最大的特点就功能全面&#xff0c;结构简单&#xff0c;角色功能明确。其不同角色实现以下基本功能。 服务端 后台首页&#xff1a;可以直接跳转到后台首页。 用户信息管理&#xff1a;管理所有申请通过的用户。 商品信息管理&#xff1a;管理校园二手物品中…

正则表达式使用总结

一、字符匹配 普通字符&#xff1a;普通字符按照字面意义进行匹配&#xff0c;例如匹配字母 "a" 将匹配到文本中的 "a" 字符。 元字符&#xff1a;元字符具有特殊的含义&#xff0c;例如 \d 匹配任意数字字符&#xff0c;\w 匹配任意字母数字字符&#xf…

【高阶产品策略】设计有效的AB测试

文章目录 1、A/B测试概述2、A/B测试实施过程3、A/B测试中需要注意的地方4、从一个案例中看A/B测试 1、A/B测试概述 2、A/B测试实施过程 3、A/B测试中需要注意的地方 4、从一个案例中看A/B测试

winform性能内存泄露检测工具

在WinForms应用程序中检测内存泄漏是非常重要的&#xff0c;因为内存泄漏可能会导致应用程序性能下降或崩溃。以下是一些可以帮助你检测WinForms应用程序中内存泄漏的工具和方法&#xff1a; 1. **Visual Studio内存分析器**&#xff1a; - Visual Studio自带了内存分析器工…

【Web_接口测试_Python3_日期时间库】Arrow获取过去/当前未来时间日期、格式化时间日期、转换时间戳、获取不同时区时间日期等

## 简介 Arrow是一个 Python 库&#xff0c;它提供了一种明智且人性化的方法来创建、操作、格式化和转换日期、时间和时间戳。它实现并更新 datetime 类型&#xff0c;填补了功能上的空白&#xff0c;并提供了支持许多常见创建方案的智能模块 API。简而言之&#xff0c;它可以帮…

云备份客户端——数据管理模块

数据管理模块设计之前&#xff0c;我们需要先明确该模块的信息是用来做什么的。根据上文分析该模块信息主要用于判断一个文件是否需要备份&#xff0c;判断条件有两个&#xff1a;1.新增文件 2.被修改过的文件 新增文件好判断&#xff0c;由于我们获得新文件后是先上传文件&…

Fiber 架构实现流程

Fiber 架构是 React 中用于实现虚拟 DOM 的一种算法架构。它的目标是提高渲染性能和用户体验&#xff0c;通过将渲染工作分割成多个小任务&#xff0c;在不阻塞主线程的情况下逐步完成整个渲染过程。 下面是 Fiber 架构的简要实现过程&#xff1a; 构建 Fiber 树&#xff1a;在…

ffmpeg-android studio创建jni项目

一、创建native项目 1.1、选择Native C 1.2、命名项目名称 1.3、选择C标准 1.4、项目结构 1.5、app的build.gradle plugins {id com.android.application }android {compileSdk 32defaultConfig {applicationId "com.anniljing.ffmpegnative"minSdk 25targetSdk 32…