我们知道域名是为了方便记忆而专门建立的一套地址转换系统,要访问一台互联网上的服务器,最终还必须通过IP地址来实现,域名解析就是将域名重新转换为IP地址的过程。一个域名对应一个IP地址,一个IP地址可以对应多个域名;所以多个域名可以同时被解析到一个IP地址。域名解析需要由专门的域名解析服务器(DNS)来完成。 解析过程,比如,一个域名为:www.staspcom,是想看到这个现HTTP服务,如果要访问网站,就要进行解析,首先在域名注册商那里通过专门的DNS服务器解析到一个WEB服务器的一个固定IP上:211.214.1.***,然后,通过WEB服务器来接收这个域名,把www.staspcom这个域名映射到这台服务器上。那么,输入www.staspcom这个域名就可以实现访问网站内容了.即实现了域名解析的全过程; 人们习惯记忆域名,但机器间互相只认IP地址,域名与IP地址之间是对应的,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的。 域名解析协议(DNS)用来把便于人们记忆的主机域名和电子邮件地址映射为计算机易于识别的IP地址。DNS是一种c/s的结构,客户机就是用户用于查找一个名字对应的地址,而服务器通常用于为别人提供查询服务。
下面我们编程实现域名解析,
#include "stdafx.h" #include "test3.h" #include "test3Dlg.h" #include "Windns.h" #include "Winsock2.h" #include "Winerror.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // Ctest3Dlg 对话框 Ctest3Dlg::Ctest3Dlg(CWnd* pParent /*=NULL*/) : CDialog(Ctest3Dlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void Ctest3Dlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_IPADDRESS1, m_addrCtrl1); DDX_Control(pDX, IDC_IPADDRESS2, m_ipaddrCtrl2); DDX_Control(pDX, IDC_LIST1, m_ListBox); } BEGIN_MESSAGE_MAP(Ctest3Dlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_BUTTON1, &Ctest3Dlg::OnBnClickedButton1) ON_NOTIFY(IPN_FIELDCHANGED, IDC_IPADDRESS1, &Ctest3Dlg::OnIpnFieldchangedIpaddress1) END_MESSAGE_MAP() // Ctest3Dlg 消息处理程序 BOOL Ctest3Dlg::OnInitDialog() { CDialog::OnInitDialog(); CMenu* pSysMenu = GetSystemMenu(FALSE); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 SetDlgItemText(IDC_E_NAME,"www.baidu.com"); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void Ctest3Dlg::OnSysCommand(UINT nID, LPARAM lParam) { CDialog::OnSysCommand(nID, lParam); } void Ctest3Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // HCURSOR Ctest3Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void Ctest3Dlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 PDNS_RECORD* pPDNS_Record; PDNS_RECORD pDNSRecord; DNS_RECORD myDNS_RECORD; DNS_STATUS DNS_Status; PVOID* ppReserve; CString strName,strServerIP ; DWORD hostip=0; GetDlgItemText(IDC_E_NAME,strName); DWORD dwDNSServIP; m_addrCtrl1.GetAddress(dwDNSServIP); IP4_ARRAY ip4array,tempArray,*pip4array; CString tempStrName; ip4array.AddrCount=1; ip4array.AddrArray[0]=htonl(dwDNSServIP); DWORD dwip=htonl(dwDNSServIP); CString str; DNS_RECORD* ppQueryResultsSet = NULL; pDNSRecord=&myDNS_RECORD; pPDNS_Record=NULL;// & pDNSRecord; pip4array=&ip4array; if (!dwip) pip4array=NULL; DNS_Status = DnsQuery(strName, DNS_TYPE_CNAME, DNS_QUERY_BYPASS_CACHE, pip4array, &ppQueryResultsSet,NULL); //待查询域名的别名CNAME int i=0; while (m_ListBox.GetCount()>0) { m_ListBox.DeleteString(m_ListBox.GetCount()-1); } if(DNS_Status != ERROR_SUCCESS) { DNS_Status = DnsQuery(strName,DNS_TYPE_A,DNS_QUERY_BYPASS_CACHE, pip4array, &ppQueryResultsSet,NULL); //&ip4array } else { while(DNS_Status==ERROR_SUCCESS) { tempStrName.Format("DNS:%s", ppQueryResultsSet->Data.CNAME); m_ListBox.InsertString(m_ListBox.GetCount(),tempStrName); strName.Format("%s", ppQueryResultsSet->Data.CNAME); tempArray.AddrCount=1; tempArray.AddrArray[0]=ppQueryResultsSet->Data.A.IpAddress; DNS_Status = DnsQuery(strName, DNS_TYPE_CNAME, DNS_QUERY_BYPASS_CACHE, pip4array, &ppQueryResultsSet,NULL); //别名 } DNS_Status = DnsQuery(strName, DNS_TYPE_A, DNS_QUERY_BYPASS_CACHE, pip4array, &ppQueryResultsSet,NULL); //&ip4array } m_ListBox.InsertString(m_ListBox.GetCount(),"\nQuery chains:\n"); int insertPos=m_ListBox.GetCount(); if(DNS_Status == ERROR_SUCCESS) { dwip=ppQueryResultsSet->Data.A.IpAddress; hostip=ntohl(dwip); m_ipaddrCtrl2.SetAddress(hostip);//得到的目标域名IP // Found the Host Name ip: do { dwip=ppQueryResultsSet->Data.A.IpAddress; hostip=ntohl(dwip); //m_ipaddrCtrl2.SetAddress(hostip); str.Format("%s(%d.%d.%d.%d)\n",ppQueryResultsSet->pName, HIBYTE(HIWORD(hostip)), LOBYTE(HIWORD(hostip)), HIBYTE(LOWORD(hostip)), LOBYTE(LOWORD(hostip))); m_ListBox.InsertString(insertPos,str); ppQueryResultsSet=ppQueryResultsSet->pNext; }while(ppQueryResultsSet); m_ListBox.InsertString(insertPos,"(destination)"); }else AfxMessageBox("Failure!"); } void Ctest3Dlg::OnIpnFieldchangedIpaddress1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMIPADDRESS pIPAddr = reinterpret_cast<LPNMIPADDRESS>(pNMHDR); *pResult = 0; }