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实现域名解析(附源码)的主要内容,如果未能解决你的问题,请参考以下文章