一、地址转换总体思路

  1. 深入底层,地址还是二进制形式,只是存储方式有小端还有大端形式;
  2. 表示给用户时:点分十进制数表示的IP地址转换成网络字节顺序的IP地址
  3. 网络实际传输时:主机字节顺序转成网络字节顺序
  4. 根据用户需要,
    展示:将小端或或者大端方式存储的二进制形式,转成十进制或者十六进制形式展现出来
    传递:或者转成网络字节顺序,在网络上传输。

二、inet_addr()

1. 点分十进制数表示的IP地址转换成网络字节顺序的IP地址
#include <iostream>
#include <Winsock2.h>
#pragma comment(lib, "wsock32.lib")using namespace std;int main()
{unsigned long IP;IP =inet_addr("192.168.0.1");cout << IP << endl;system("Pause");return 0;
}

1.1 出现错误:

错误 C4996 ‘inet_addr’: Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings DSN Domain Resolution H:\source\TCP\DSN Domain Resolution\DSN Domain Resolution\main.cpp 13

1.2 错误图片 :C4996
1.3 解决办法:更改SDL检查为否

三、主机字节顺序转成网络字节顺序

  1. 源码:
#include <Winsock2.h>
#include <iostream>
#pragma comment(lib,"wsock.lib")using namespace std;int main()
{       unsigned long hostaddr=0xAABBCCDD; // 定义本机字节AABBCCDDunsigned long netaddr;         // 定义网络字节netaddr=htonl(hostaddr);      // 使用函数htonl()进行转换 host to net cout<<"hostaddr:"<<hostaddr<<endl;   // 输出hostaddrcout<<"netaddr:"<<netaddr<<endl;   // 输出netaddrsystem("Pause");return 0;
}
  1. 实验结果

四、网络信息获取函数应用实例

来源:《TCP/IP协议与网络编程》 任泰明 编著
DNS解析数据流动方向:

  1. hostname 获取主机名字-> 2. hostent 获取主机信息-> 3. pHostent->h_addr_list[n] 解析地址 -> 4. pProtoent 展示协议信息

hostent内容

-> name 主机名字
-> aliase 主机别名
-> addrtype 地址类型
-> length 地址长度(字节)
-> addr_list[n]

addr_list[n]内容

addr_list[n](IP列表,IP地址是4个字节,32位,
这里获取的IP地址是网络字节顺序,
通过inet_ntoa(sa.sin_addr)函数,将其转换成点分十进制数表示的IP地址

注意:这里使用了memcpy()函数,直接复制32位内存,即IP地址,
猜想可能和小端方式,大端方式有关,
即无论我是小端方式,还是大端方式,都直接复制过来。
但windows系统规定了是小端方式,
所以,它的转换函数inet_ntoa(sa.in_addr)也是针对小端方式来设计的)

1. 源码
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib, "wsock32.lib")int main()
{WSADATA wsaData;int        n;// 存放主机名称char hostname[256];// 主机信息指针hostent* pHostent;// 主机协议信息指针protoent* pProtoent;// sockaddr_in结构指端口和IP地址信息  struct sockaddr_in sa;// 其实 不用struct也能够成功执行// sockaddr_in sa; if (WSAStartup(MAKEWORD(2, 2), &wsaData )!= 0) {printf("Failed to load Winsock.\n");return -1;}printf("-----------------------------------------------\n");// 获得主机名if (gethostname(hostname, sizeof(hostname)) != 0) {printf("gethostname() Error:%u\n",WSAGetLastError());return -2;}printf("以下信息由gethostname()函数取得\n");printf("Local host name:%s\n",hostname);printf("------------------------------------------------\n");// 根据主机名获取主机信息pHostent = gethostbyname(hostname);if (pHostent == NULL){printf("gethostbyname()Error:%u\n",WSAGetLastError());return -3;}// 解析返回的hostent结构中名称、别名、地址类型和地址长度信息printf("以下信息由gethostbyname()函数取得\n");printf("name:%s\naliases:%s\naddrtype:%d\nlength:%d\n",pHostent->h_name,pHostent->h_aliases,pHostent->h_addrtype,pHostent->h_length);// 解析hostent结构中的主机地址for (n = 0; pHostent->h_addr_list[n]; n++){// memcpy函数在C/C++中都可以使用 内存拷贝函数/* memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void *destin, void *source, unsigned n);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。*/memcpy(&sa.sin_addr.s_addr,pHostent->h_addr_list[n],pHostent->h_length);// 输出主机IP地址。printf("Address:%s\n",inet_ntoa(sa.sin_addr));}printf("-------------------------------------------------\n");// 根据协议名获得协议信息pProtoent = getprotobyname("tcp");if (pProtoent == NULL) {printf("getprotobyname()Error:%u\n", WSAGetLastError());return -4;}// 解析protoent结构中的信息printf("以下信息由getprotobyname()函数取得\n");printf("name:%s\nproto:%d\n",pProtoent->p_name,pProtoent->p_proto);for (n = 0; pProtoent->p_aliases[n]; n++) {printf("aliases:%s\n",pProtoent->p_aliases[n]);}WSACleanup();system("Pause");return 0;
}
2. 应用

3. 问题:
  1. 获取本地主机名和IP地址如何实现?上面实例是获取本地主机名,和DNS解析还有一定差距,应该是采用下面的应用,探索ing。
  2. 获取网络主机名和IP地址又如何实现?在此基础上完成DNS域名解析?
  3. DNS域名解析和ping工具有什么联系吗?

Winsock API基本函数

1. WinSock的初始化:
  1. 任何基于Winsock的程序,首先要将正确的Winsock的DLL装入到内存中。如Winsock2的应用程序,则要加载ws2_32.dll文件
2. 应用:
# pragma comment(lib, "wsock32.lib")

2. Winsock的打开——WSAStartup()

功能:
  1. 加载响应的WinSock的dll版本。在使用WinSock函数前,若没有加载WinSock库,则函数就会返回一个SOCKET_ERROR
  2. 通过调用WSAStartup()函数便可检测系统中有没有一个或者多个Windows Sockets实现。
  3. 本函数必须是应用程序或DLL调用的第一个Windows Sockets函数,它允许应用程序或DLL指明Windows Sockets API的版本号及获得特定Windows Socket实现的细节。
  4. 应用程序或DLL只能在一次成功的WSAStartup()调用之后才能进一步调用其他的Windows Sockets API函数。
应用:
  1. C++空项目
  2. Win32应用程序

一、C++ 空项目

# include <stdio.h>
# include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")int main()
{WORD wVersionRequested;WSAData wsaData;wVersionRequested = MAKEWORD(2, 2);// 打开winsock WSAData if (WSAStartup(wVersionRequested, &wsaData) != 0){// Winsock 初始化错误 !// 输出Winsock初始化错误信息,如“WSAStartup failed”MessageBox(NULL, "Initialization error!\n WSAStartup failed!", "Intialization error!", 0);return -1;}// 以下两种方法中的任意一种进行版本号匹配的检查// 版本号是两字节 // 判断高字节HIBYTE==2 低字节LOBYTE==2if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2){MessageBox(NULL, "Winsock2装载的版本不对!", "WSAStartup", 0);WSACleanup();return -1;}char data[400];sprintf_s(data, 400, "WSAStartup装载成功!\n版本是:%d,%d\n描述:%s\n状态:",HIBYTE(wsaData.wVersion), LOBYTE(wsaData.wVersion), wsaData.szDescription, wsaData.szSystemStatus);MessageBox(NULL, data, "装载WSAStartup", 0);WSACleanup();return 0;
}


二、 Win32应用程序

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{WORD wVersionRequested;WSAData wsaData;wVersionRequested = MAKEWORD(2, 2);// 打开winsock WSAData if (WSAStartup(wVersionRequested, &wsaData) != 0){// Winsock 初始化错误 !// 输出Winsock初始化错误信息,如“WSAStartup failed”MessageBox(NULL, "Initialization error!\n WSAStartup failed!","Intialization error!",0);return -1;}// 以下两种方法中的任意一种进行版本号匹配的检查// 版本号是两字节 // 判断高字节HIBYTE==2 低字节LOBYTE==2if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2){MessageBox(NULL, "Winsock2装载的版本不对!", "WSAStartup", 0);WSACleanup();return -1;}char data[400];sprintf_s(data,400,"WSAStartup装载成功!\n版本是:%d,%d\n描述:%s\n状态:%s",HIBYTE(wsaData.wVersion), LOBYTE(wsaData.wVersion),wsaData.szDescription,wsaData.szSystemStatus);MessageBox(NULL,data ,"装载WSAStartup",0);WSACleanup();return 0;
}

TCP/IP编程:DNS域名解析相关推荐

  1. https网络编程——DNS域名解析获取IP地址

    参考:DNS域名解析 地址:https://qingmu.blog.csdn.net/article/details/115825036?spm=1001.2014.3001.5502 1.原理 我在 ...

  2. 网络基础(2)---子网划分、TCP/IP、DNS、DHCP

    网络基础(2) IP的分类: A,B,C,D,E A,B,C三类为单播地址 (既可以作为源IP,也可以作为目标IP使用) D ---- 组播地址 只能作为目标IP使用 E ---- 保留地址 ​ 单播 ...

  3. 图解HTTP之一--网络基础(TCP/IP、DNS)

    网络基础TCP/IP 1. TCP/IP协议族 计算机与网络设备要相互通信,双方就必须基于相同的方法.比如:如何探测到通信目标.由哪一边先发起通信.使用哪种语言进行通信.怎样结束通信等规则都需要事先确 ...

  4. 【计算机网络】TCP/IP协议(DNS协议、IP协议、TCP协议、UDP协议、三次握手、四次挥手)

    TCP/IP协议 TCP/IP协议 TCP/IP各层作用与常见协议 各种协议与HTTP协议的关系 TCP/IP协议 本文参考<图解HTTP>--上野宣 TCP/IP是Internet上所有 ...

  5. socket与tcp/ip编程

    Socket接口是TCP/IP网络的API ,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socke ...

  6. linux u8 头文件,2019-12-11 转载TCP/IP编程常用C语言头文件

    网络编程的头文件(这里所有的头文件都在/usr/include目录下面) 经常被一些头文件搞大,不知到到哪个头文件去找结构.这里做个总结 ---------------- 版权声明:本文为CSDN博主 ...

  7. 2019-12-11 转载TCP/IP编程常用C语言头文件

    网络编程的头文件(这里所有的头文件都在/usr/include目录下面) 经常被一些头文件搞大,不知到到哪个头文件去找结构.这里做个总结 ---------------- 版权声明:本文为CSDN博主 ...

  8. linux实现局域网IP欺骗dns域名解析

    大家可以到我git托管平台clone一份测测看,本人程序小白,有问题欢迎指出,共同进步.https://github.com/guojunfengcode/udp_raw_socket.git 1.简 ...

  9. Linux下的TCP/IP编程----IO复用及IO复用服务端

    http://blog.csdn.net/wqc_csdn/article/details/51583901 在之前我们实现的并发服务端时通过床将多个进程来实现的,这种并实现并发的方式简单方便,但是进 ...

最新文章

  1. CGIC简明教程(转摘)
  2. 【Fourier Convolution】傅里叶卷积
  3. python 写入excel_使用python将数据写入excel
  4. flash与IPhone
  5. 【Java语法】StringBuilder 可变字符序列 和普通String的对比
  6. jvm系列(九):如何优化Java GC
  7. rpc 服务器不可用_RPC和微服务
  8. 大数据_Hbase-内容回顾_知识点补充_线程安全与wait的区别---Hbase工作笔记0019
  9. 库克回应乔纳森离职:不影响苹果继续创新
  10. 【剑指Offer速刷与技巧笔记】剑指Offer重点面试刷题
  11. proteus中power怎么设置电压_Proteus 电源设置
  12. 谈谈功能测试与非功能测试(最详细)
  13. java集合优秀率怎么算,优秀率怎么算(及格率和优秀率公式)
  14. 大数据技术原理与应用之可视化实训
  15. 自然语言处理——谷歌BERT模型深度解析
  16. 揭秘:张国荣葬礼,袁咏仪为何哭到失控?
  17. node.js事件驱动的非阻塞 I/O模型理解
  18. 夜神模拟器(Android7)+BurpSuit配置抓取HTTPS包
  19. 中国石油大学(北京)-《外国文学作品选读》第一阶段在线作业
  20. 10月25日 c语言 打印所有水仙花数

热门文章

  1. (202103更新)海康威视网络摄像头sdk python版 (报错排查) 移动物体检测 多通道海康威视网洛摄像头后台检测 海康威视网络摄像头Python SDK
  2. C语言复数代数式转化成极坐标式,问题:正弦量的相量是复数。 复数有四种表示形式,四种形式可以相互转换。其中代数式和极坐标形式应用得最为广泛。...
  3. eclipse导入项目出现红色感叹号?
  4. 实验五 MapReduce实验:单词计数
  5. 表的描述(键、码、候选码[关键字])
  6. Dump微信PC端的界面Duilib文件
  7. 达梦数据库DM8-多表连接查询
  8. zabix监控linux进程名称,zabbix监控Linux进程方法
  9. CentOS7.6安装Git(IUS方式)
  10. 《软件工程》— 《软件工程思想》读后感