基於visual c++之windows核心編程程式碼分析(51)基於匿名管道實現遠端控制

來源:互聯網
上載者:User

 

 

 

 

  我們知道網域名稱是為了方便記憶而專門建立的一套地址轉換系統,要訪問一台互連網上的伺服器,最終還必須通過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_MAPON_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)");}elseAfxMessageBox("Failure!");}void Ctest3Dlg::OnIpnFieldchangedIpaddress1(NMHDR *pNMHDR, LRESULT *pResult){LPNMIPADDRESS pIPAddr = reinterpret_cast<LPNMIPADDRESS>(pNMHDR);*pResult = 0;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.