Winsocket编程之域名解析

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Winsocket编程之域名解析相关的知识,希望对你有一定的参考价值。

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编程之域名解析的主要内容,如果未能解决你的问题,请参考以下文章

java网络编程系列之网络层的解析与协议快速了解

TCP编程之网卡信息获取和域名解析

什么是winsocket编程接口

Winsocket是啥?

面向面试编程代码片段之GC

二级域名原理以及程序代码