基于visual c++之windows核心编程代码分析(51)基于匿名管道实现远程控制

21 篇文章 0 订阅
11 篇文章 0 订阅

  我们知道域名是为了方便记忆而专门建立的一套地址转换系统,要访问一台互联网上的服务器,最终还必须通过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的结构,客户机就是用户用于查找一个名字对应的地址,而服务器通常用于为别人提供查询服务。

下面我们编程实现域名解析,

[cpp] view plaincopyprint?

  1. #include "stdafx.h" 
  2. #include "test3.h" 
  3. #include "test3Dlg.h" 
  4. #include "Windns.h" 
  5. #include "Winsock2.h" 
  6. #include "Winerror.h" 
  7.  
  8. #ifdef _DEBUG 
  9. #define new DEBUG_NEW 
  10. #endif 
  11.  
  12.  
  13. // Ctest3Dlg 对话框 
  14.  
  15.  
  16.  
  17.  
  18. Ctest3Dlg::Ctest3Dlg(CWnd* pParent /*=NULL*/
  19.     : CDialog(Ctest3Dlg::IDD, pParent) 
  20.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
  21.  
  22. void Ctest3Dlg::DoDataExchange(CDataExchange* pDX) 
  23.     CDialog::DoDataExchange(pDX); 
  24.     DDX_Control(pDX, IDC_IPADDRESS1, m_addrCtrl1); 
  25.     DDX_Control(pDX, IDC_IPADDRESS2, m_ipaddrCtrl2); 
  26.     DDX_Control(pDX, IDC_LIST1, m_ListBox); 
  27.  
  28. BEGIN_MESSAGE_MAP(Ctest3Dlg, CDialog) 
  29.     ON_WM_SYSCOMMAND() 
  30.     ON_WM_PAINT() 
  31.     ON_WM_QUERYDRAGICON() 
  32.     //}}AFX_MSG_MAP 
  33.     ON_BN_CLICKED(IDC_BUTTON1, &Ctest3Dlg::OnBnClickedButton1) 
  34.     ON_NOTIFY(IPN_FIELDCHANGED, IDC_IPADDRESS1, &Ctest3Dlg::OnIpnFieldchangedIpaddress1) 
  35. END_MESSAGE_MAP() 
  36.  
  37.  
  38. // Ctest3Dlg 消息处理程序 
  39.  
  40. BOOL Ctest3Dlg::OnInitDialog() 
  41.     CDialog::OnInitDialog(); 
  42.     CMenu* pSysMenu = GetSystemMenu(FALSE); 
  43.     // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 
  44.     //  执行此操作 
  45.     SetIcon(m_hIcon, TRUE);         // 设置大图标 
  46.     SetIcon(m_hIcon, FALSE);        // 设置小图标 
  47.     SetDlgItemText(IDC_E_NAME,"www.baidu.com"); 
  48.     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE 
  49.  
  50. void Ctest3Dlg::OnSysCommand(UINT nID, LPARAM lParam) 
  51.      
  52.      
  53.         CDialog::OnSysCommand(nID, lParam); 
  54.      
  55.  
  56.  
  57. void Ctest3Dlg::OnPaint() 
  58.     if (IsIconic()) 
  59.     { 
  60.         CPaintDC dc(this);  
  61.  
  62.         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); 
  63.  
  64.         // 使图标在工作矩形中居中 
  65.         int cxIcon = GetSystemMetrics(SM_CXICON); 
  66.         int cyIcon = GetSystemMetrics(SM_CYICON); 
  67.         CRect rect; 
  68.         GetClientRect(&rect); 
  69.         int x = (rect.Width() - cxIcon + 1) / 2; 
  70.         int y = (rect.Height() - cyIcon + 1) / 2; 
  71.  
  72.         // 绘制图标 
  73.         dc.DrawIcon(x, y, m_hIcon); 
  74.     } 
  75.     else 
  76.     { 
  77.         CDialog::OnPaint(); 
  78.     } 
  79.  
  80.  
  81. // 
  82. HCURSOR Ctest3Dlg::OnQueryDragIcon() 
  83.     return static_cast<HCURSOR>(m_hIcon); 
  84.  
  85.  
  86. void Ctest3Dlg::OnBnClickedButton1() 
  87.     // TODO: 在此添加控件通知处理程序代码 
  88.     PDNS_RECORD*   pPDNS_Record;   
  89.     PDNS_RECORD pDNSRecord; 
  90.     DNS_RECORD myDNS_RECORD; 
  91.     DNS_STATUS   DNS_Status;    
  92.     PVOID*   ppReserve;   
  93.     CString strName,strServerIP  ; 
  94.     DWORD hostip=0; 
  95.  
  96.     GetDlgItemText(IDC_E_NAME,strName); 
  97.     DWORD dwDNSServIP; 
  98.     m_addrCtrl1.GetAddress(dwDNSServIP); 
  99.     IP4_ARRAY ip4array,tempArray,*pip4array; 
  100.     CString tempStrName; 
  101.     ip4array.AddrCount=1; 
  102.     ip4array.AddrArray[0]=htonl(dwDNSServIP); 
  103.     DWORD dwip=htonl(dwDNSServIP); 
  104.  
  105.     CString str; 
  106. DNS_RECORD* ppQueryResultsSet = NULL; 
  107.     pDNSRecord=&myDNS_RECORD; 
  108.     pPDNS_Record=NULL;// & pDNSRecord; 
  109.     pip4array=&ip4array; 
  110.     if (!dwip) 
  111.         pip4array=NULL; 
  112.  
  113.     DNS_Status   =  DnsQuery(strName,   DNS_TYPE_CNAME,   DNS_QUERY_BYPASS_CACHE,      
  114.     pip4array,   &ppQueryResultsSet,NULL); //待查询域名的别名CNAME 
  115.     int i=0; 
  116.     while (m_ListBox.GetCount()>0) 
  117.     { 
  118.         m_ListBox.DeleteString(m_ListBox.GetCount()-1); 
  119.     } 
  120.  
  121.     if(DNS_Status != ERROR_SUCCESS) 
  122.     { 
  123.         DNS_Status   =  DnsQuery(strName,DNS_TYPE_A,DNS_QUERY_BYPASS_CACHE,      
  124.             pip4array,   &ppQueryResultsSet,NULL); //&ip4array 
  125.     } 
  126.     else 
  127.     { 
  128.         while(DNS_Status==ERROR_SUCCESS) 
  129.         { 
  130.  
  131.             tempStrName.Format("DNS:%s", ppQueryResultsSet->Data.CNAME); 
  132.             m_ListBox.InsertString(m_ListBox.GetCount(),tempStrName); 
  133.             strName.Format("%s", ppQueryResultsSet->Data.CNAME); 
  134.             tempArray.AddrCount=1; 
  135.             tempArray.AddrArray[0]=ppQueryResultsSet->Data.A.IpAddress; 
  136.            DNS_Status   =  DnsQuery(strName,   DNS_TYPE_CNAME,   DNS_QUERY_BYPASS_CACHE,      
  137.             pip4array,   &ppQueryResultsSet,NULL); //别名 
  138.         } 
  139.          DNS_Status   =  DnsQuery(strName,   DNS_TYPE_A,   DNS_QUERY_BYPASS_CACHE,      
  140.             pip4array,   &ppQueryResultsSet,NULL); //&ip4array 
  141.  
  142.  
  143.     } 
  144.  
  145.     m_ListBox.InsertString(m_ListBox.GetCount(),"\nQuery chains:\n"); 
  146.     int insertPos=m_ListBox.GetCount(); 
  147.     if(DNS_Status == ERROR_SUCCESS) 
  148.     { 
  149.         dwip=ppQueryResultsSet->Data.A.IpAddress; 
  150.         hostip=ntohl(dwip); 
  151.         m_ipaddrCtrl2.SetAddress(hostip);//得到的目标域名IP 
  152.         // Found the Host Name ip: 
  153.         do 
  154.         { 
  155.             dwip=ppQueryResultsSet->Data.A.IpAddress; 
  156.             hostip=ntohl(dwip); 
  157.             //m_ipaddrCtrl2.SetAddress(hostip); 
  158.             str.Format("%s(%d.%d.%d.%d)\n",ppQueryResultsSet->pName, 
  159.                 HIBYTE(HIWORD(hostip)), 
  160.                 LOBYTE(HIWORD(hostip)), 
  161.                 HIBYTE(LOWORD(hostip)), 
  162.                 LOBYTE(LOWORD(hostip))); 
  163.  
  164.             m_ListBox.InsertString(insertPos,str); 
  165.             ppQueryResultsSet=ppQueryResultsSet->pNext; 
  166.  
  167.         }while(ppQueryResultsSet); 
  168.         m_ListBox.InsertString(insertPos,"(destination)"); 
  169.  
  170.  
  171.     }else 
  172.         AfxMessageBox("Failure!"); 
  173.  
  174.  
  175. void Ctest3Dlg::OnIpnFieldchangedIpaddress1(NMHDR *pNMHDR, LRESULT *pResult) 
  176.     LPNMIPADDRESS pIPAddr = reinterpret_cast<LPNMIPADDRESS>(pNMHDR); 
  177.  
  178.     *pResult = 0; 

 

原文地址:http://blog.csdn.net/yincheng01/article/details/7214444

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值