VC++调用gethostbyname实现域名解析(附源码)

Posted dvlinker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++调用gethostbyname实现域名解析(附源码)相关的知识,希望对你有一定的参考价值。

       在使用socket套接字去连接远端的服务器时,需要使用IP和远端服务器建链,不能直接使用域名,但我们配置服务器地址时有时需要设置域名,这需要我们在代码中添加域名解析的模块,在连接服务器之前将域名解析成IP地址

       那如何实现将域名解析成IP地址呢?其实很简单,只要调用系统API函数gethostbyname即可实现。注意,gethostbyname函数可能会产生短暂的堵塞,该函数内部会先到网卡配置的DNS服务器上去查询域名对应的IP地址,如果本地DNS查询不到,则会到远端的DNS服务器上去查询,所以可能会比较耗时。

       所以我们需要将对gethostbyname函数调用的代码,放置在一个新的线程中,等解析出来后再将IP信息投递出来给主线程。相关的代码如下所示:

// 域名解析线程函数
UINT __stdcall QueryDomainThread( LPVOID pParam )

	char* lpszDomainName = (char*)pParam; 

	struct hostent *pHost = gethostbyname( lpszDomainName ); 
	if( NULL == pHost )  
	   
		// ::PostMessage // 通知主线程域名解析失败
		return 0;   
	

	if ( pHost->h_addr_list[0] != NULL ) 
	 
		u32 dwIP = (*(in_addr*)pHost->h_addr_list[0]).S_un.S_addr; 
		// ::PostMessage // 通知主线程域名解析成功,将解析出来的IP投递过去
	  

	return 0; 


// 发起域名解析,创建新的线程去解析
LRESULT StartQueryDomain( char* lpszDomainName )

	// 此处不能直接将局部变量lpszDomainName传到线程函数中,因为启动线程的_beginthreadex返回时,线程函数不一定跑起来了
	// 所以最好搞一个成员变量或者全局变量,将lpszDomainName中的字符串拷贝下来,然后给_beginthreadex传递这个声明周期
	// 更长的变量
	strcpy( g_szMDomainName, lpszDomainName );

    // 线程函数QueryDomainThread的实现,上面已经给出
	HANDLE hThread= (HANDLE)_beginthreadex( NULL, 0, QueryDomainThread, (void*)g_szMDomainName, 0, NULL );
	if( hThread != NULL )
	
		CloseHandle( hThread );
		return S_OK;
	

	return S_FALSE;

以上是关于VC++调用gethostbyname实现域名解析(附源码)的主要内容,如果未能解决你的问题,请参考以下文章

编程黑科技gethostbyname()函数:通过域名获取IP地址!

浅谈getaddrinfo函数的超时处理机制

linux系统wget命令能解析https域名吗

gethostbyname代码示例(Windows CE)

Winsocket编程之域名解析

浏览器输入url后发生了什么