首先我们来实现一个DNS查询功能,该功能的目的是传入一个网站域名自动将该域名解析为对应的IP地址,该功能的实现依赖于gethostbyname函数,该函数将主机名作为参数,并返回一个指向hostent类型结构的指针,结构包含有关主机的信息。结构包含许多字段,其中最重要的是h_nameh_addr_listh_name是主机名,h_addr_list是一个指向具有主机IP地址的地址列表的指针。

hostent 是一个结构体,用于存储主机的基本信息,包括主机名、主机别名、IP 地址类型和地址列表等。

它的定义一般类似于以下:

struct hostent {
char *h_name; /* 官方主机名 */
char **h_aliases; /* 主机别名 */
int h_addrtype; /* IP地址类型(IPv4或IPv6)*/
int h_length; /* IP地址长度 */
char **h_addr_list; /* IP地址列表 */
};

其中,h_name字段是主机的官方名称,h_aliases字段是一个指向主机别名列表的指针,h_addrtype 字段指示地址类型(通常是 AF_INETAF_INET6),h_length 字段是地址长度(通常为 4 或 16 字节),h_addr_list 字段是一个指向 IP 地址列表的指针。在 IPv4 中,h_addr_list 指向一个由网络字节顺序的 4 字节整数(即 IPv4 地址)组成的数组,而在 IPv6 中则是指向由 16 字节无符号整数组成的数组(即 IPv6 地址)。

#include <iostream>
#include <WinSock2.h>
#include <IPHlpApi.h>
#include <IcmpAPI.h> #pragma comment (lib,"iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib") // 传入域名返回该域名对应IP地址
CHAR* GetHostByName(char * HostName)
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
return "None";
} // 获取当前主机结构体信息
struct hostent *ptr = gethostbyname(HostName);
if (!ptr)
{
return "None";
} // 解析地址类型
printf("地址类型: %s \n", (ptr->h_addrtype == AF_INET) ? "IPV4" : "IPV6"); // 解析别名
for (int i = 0; ptr->h_aliases[i]; i++)
{
printf("别名 [%d]: %s \n", i + 1, ptr->h_aliases[i]);
} // 解析IP地址列表
for (int i = 0; ptr->h_addr_list[i]; i++)
{
printf("IP地址 [%d]: %s \n", i + 1, inet_ntoa(*(struct in_addr*)ptr->h_addr_list[i]));
} WSACleanup(); if (ptr)
{
in_addr inAddr;
ULONG addr = *(u_long *)ptr->h_addr_list[0];
inAddr.s_addr = addr; // 返回IP地址
return inet_ntoa(inAddr);
} return "None";
} int main(int argc, char *argv[])
{
char * HostAddress = GetHostByName("www.lyshark.com");
printf("网站IP地址 = %s \n", HostAddress);
system("pause");
return 0;
}

15.1 套接字通过域名取IP地址的更多相关文章

  1. 移动IP 它最初设想每个人都在编写应用层(7)API而不是传输层(4)API 对于QUIC,连接的标识符不是“套接字”(源/目标端口/地址协议组合)的传统概念,而是分配给连接的64位标识符

    小结: 1. 因为您对OSI模型的教育中缺少的一点是,它最初设想每个人都在编写应用层(7)API而不是传输层(4)API.应该有像应用程序服务元素之类的 东西,它们可以以标准方式处理文件传输和消息传递 ...

  2. 一文看懂:网址,URL,域名,IP地址,DNS,域名解析

    一个执着于技术的公众号 前言 今天给大家梳理一篇关于网址.URL.IP地址.域名.DNS.域名解析的白话长文,并以简单的提问-解答 形式让读者更加深刻理解,希望有助于读者的学习,面试和工作! 1.一个 ...

  3. 域名dns查询_查询域名dns ip地址

    最近有部分用户反应管理的天气网站打开偏慢,决定从每一个可以出现的问题点查起!首先就是dns! 通过360dns监控对比发现,同一组域名,15tianqi.cn的dns响应时间比较长,在300-700间 ...

  4. vc根据域名获取IP地址 gethostbyname()函数

    以下是VC Socket初始化时用到的两个函数 一.WSAStartup函数                int WSAStartup                       (         ...

  5. iOS根据域名获取ip地址

    引入头文件 #include <netdb.h> #include <sys/socket.h> #include <arpa/inet.h> //根据域名获取ip ...

  6. 网站开发进阶(一)Tomcat域名或IP地址访问方式配置方法

    Tomcat域名或IP地址访问方式配置方法 1.配置www.***.com域名方式访问 在Tomcat下面配置域名(如:www.***.com)的时候,同时又不希望客户通过我们网站的IP或者域名访问到 ...

  7. Google全球服务器根域名的IP地址

    Google全球服务器根域名的IP地址 目前GOOGLE正与ZF继续谈判,此谈判结果将直接影响该公司在中国的存在此前,由于曾出现Google服务器被墙,而致使众网友只能FQ搜索的窘境而目前尚不知道若G ...

  8. Mac通过域名查询IP地址

    Mac通过域名查询IP地址 方法一:使用Mac自带的"网络实用工具" 步骤: 搜索"网络使用工具",并打开: 点击LookUp,输入互联网地址,点击Lookup ...

  9. linux c 网络编程:用域名获取IP地址或者用IP获取域名 网络地址转换成整型 主机字符顺序与网络字节顺序的转换

    用域名获取IP地址或者用IP获取域名 #include<stdio.h> #include<sys/socket.h> #include<netdb.h> int ...

  10. 网络编程基础之socket套接字编程实现同一IP下的信息传输

    鲁照山 1.网络协议的5层模型,每层内容的整理 2.画图描述三次握手四次挥手,和C端S端的状态 3.写一个客户端,实现给服务端发送hello world 字符串, 写一个服务端,将客户端发送的数据变成 ...

随机推荐

  1. AtCoder Beginner Contest 195 Editorial

    AtCoder Beginner Contest 195 Editorial Problem A - Health M Death(opens new window) 只要检查 \(H\equiv 0 ...

  2. 人人都是 Serverless 架构师 | “盲盒抽奖”创意营销活动实践

    作者 | 寒斜 & 江昱 当 Serverless 与低代码这两个不同的技术共同相交于同一个业务时会有怎样的价值展现?本文以 "盲盒抽奖" 这个 Serverless De ...

  3. vue中form组件中上传el-upload(单、多附件上传,以及上传回显以及编辑不出现等问题)

    https://blog.csdn.net/weixin_46565787/article/details/121934075?spm=1001.2101.3001.6650.2&utm_me ...

  4. treeselect 表单验证解决方法

    https://www.cnblogs.com/wxqworld/p/11203603.html

  5. excel常用函数整理(可检索)

    目录: 一.数字函数 1.1 sum 1.2 sumif 1.3 sumifs 1.4 sumproduct 1.5 abs二.统计函数 2.1 count 2.2 counta 2.3 counti ...

  6. SV task and function

    内容 system verilog过程语句:自增和自减操作符 逻辑比较操作符 逻辑值为1bit inside语句 变量类型转换 强制类型转换:$cast() 变量位宽转换 变量符号位转换 for循环语 ...

  7. STM32F429 实测基本数据类型占用空间

    实测代码 1 void CalculateDataTypeSize(void) 2 { 3 printf("sizeof(char} = %u\r\n", sizeof(char) ...

  8. 【C++】为什么含有纯虚函数的类无法定义对象

    纯虚函数的地址为空,无法分配内存,纯虚成员函数对类是没有意义的,失去了普通类的数据和方法绑定于同一对象中的意义,因此无法构造对象,只能由其派生类继承这些成员函数并实现,才能构造派生类对象. 纯虚成员函 ...

  9. Linux-目录-cd-mdkir-rm-ls-pwd

  10. 查看正在运行容器的环境变量-寻找容器运行mysql的root密码

    查看正在运行容器的环境变量-寻找容器运行mysql的root密码 背景 有一个服务器上面运行着一个长达两年的mysql数据库实例. 因为当时root密码是通过环境变量注入进去的. 现在我想重新连接一下 ...