概述
文章目录
- Winsocket编程之域名解析
- 0.前置知识
- a.hostnet
- b.gethostname()
- c.gethostbyname()
- 1.实现流程
- 2.代码
Winsocket编程之域名解析
0.前置知识
a.hostnet
hostent是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。之所以主机的地址是一个列表的形式,原因是当一个主机有多个网络接口时,自然有多个地址。
b.gethostname()
c.gethostbyname()
1.实现流程
- 启动WSA(WinSocket API)
- 用gethostname 获取本地主机名,然后用gethostbyname() 获取本地ip.
- 从控制台输入一个域名用gethostbyname() 得到hostent的结构体指针,然后获取对应的ip。
2.代码
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "WinSock2.h"
#include "iostream"
#pragma comment(lib,"ws2_32.lib") //链接WinSock导入库
using namespace std;
int main(int argc, char** argv) {
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2, 2); //调用2.2版本
if (WSAStartup(wVersionRequested, &wsaData) != 0) { //加载WinSock动态链接库
cout << "加载WinSock DLL失败!n";
return 0;
}
struct hostent* hptr;
char** pptr;
char hostname[256];
//获取主机名字
if (gethostname(hostname, sizeof(hostname))) {
cout << "获取主机名字失败!n";
WSACleanup();
return 0;
}
cout << "hostname:" << hostname << endl;
//获取本机IP地址
if ((hptr = gethostbyname(hostname)) == NULL) {
cout << "通过主机名获取本机IP地址失败!n" << endl;
WSACleanup();
return 0;
}
pptr = hptr->h_addr_list;
cout << "host_ip:" << endl;
while (*pptr != NULL) {
//inet_ntoa:将一个包含在in_addr结构变量中的长整型IP地址转换为点分十进制形式
cout << inet_ntoa(*(struct in_addr*)(*pptr)) << endl; pptr++;
}
//解析域名
cout << "输入要解析的域名:" << endl;
cin >> hostname;
if ((hptr = gethostbyname(hostname)) == NULL) {
cout << "域名解析失败!n" << endl;
WSACleanup();
return 0;
}
//输出远程机器IP地址
pptr = hptr->h_addr_list;
cout << "ip:" << endl;
while (*pptr != NULL) {
cout << inet_ntoa(*(struct in_addr*)(*pptr)) << endl; pptr++;
}
WSACleanup();
return 0;
}
最后
以上就是紧张汽车为你收集整理的Winsocket编程之域名解析Winsocket编程之域名解析的全部内容,希望文章能够帮你解决Winsocket编程之域名解析Winsocket编程之域名解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复