小試牛刀--編程實現擷取電腦的IP地址和電腦名稱

來源:互聯網
上載者:User

標籤:http   color   os   使用   io   strong   for   檔案   ar   

1.2.3  小試牛刀--編程實現擷取電腦的IP地址和電腦名稱(1)

執行個體功能 擷取當前電腦的IP地址和電腦名稱

源碼路徑 光碟片\yuanma\1\IP

本執行個體的目的是,使用Visual C++ 6.0開發一個擷取當前機器的IP地址和電腦名稱的應用程式。

1. 設計MFC表單

使用Visual C++ 6.0建立一個MFC項目後,根據本執行個體的需要設計兩個表單,分別是IDD_ABOUTBOX表單(見圖1-12)和IDD_IPADDRESS_DIALOG表單(見圖1-13)。

 
圖1-12  IDD_ABOUTBOX表單
 
圖1-13  IDD_IPADDRESS_DIALOG表單

2. 具體編碼

設計好表單之後,接下來開始講解具體編碼過程。

(1) 在檔案IPAddressDlg.cpp中實現初始化對話方塊,使用對話方塊形式顯示擷取的IP地址和電腦名稱。具體代碼如下:

  1. BOOL CIPAddressDlg::OnInitDialog()  
  2. {  
  3. CDialog::OnInitDialog();  
  4. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);  
  5. ASSERT(IDM_ABOUTBOX < 0xF000);  
  6. CMenu *pSysMenu = GetSystemMenu(FALSE);  
  7. if (pSysMenu != NULL)  
  8. {  
  9. CString strAboutMenu;  
  10. strAboutMenu.LoadString(IDS_ABOUTBOX);  
  11. if (!strAboutMenu.IsEmpty())  
  12. {  
  13. pSysMenu->AppendMenu(MF_SEPARATOR);  
  14. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);  
  15. }  
  16. }  
  17. // 設定對話方塊表徵圖  
  18. SetIcon(m_hIcon, TRUE);                     // 設定大表徵圖  
  19. SetIcon(m_hIcon, FALSE);                        // 設定小表徵圖  
  20. int nRetCode;  
  21.  
  22. nRetCode = StartUp();  
  23. TRACE1("StartUp RetCode: %d\n", nRetCode);  
  24. nRetCode = GetLocalHostName(m_sHostName);  
  25. TRACE1("GetLocalHostName RetCode: %d\n", nRetCode);  
  26. nRetCode = GetIPAddress(m_sHostName, m_sIPAddress);  
  27. TRACE1("GetIPAddress RetCode: %d\n", nRetCode);  
  28. nRetCode = CleanUp();  
  29. TRACE1("CleanUp RetCode: %d\n", nRetCode);  
  30. UpdateData(FALSE);  
  31. return TRUE;  
  32. }  
  33.  
  34. void CIPAddressDlg::OnSysCommand(UINT nID, LPARAM lParam)  
  35. {  
  36. if ((nID & 0xFFF0) == IDM_ABOUTBOX)  
  37. {  
  38. CAboutDlg dlgAbout;  
  39. dlgAbout.DoModal();  
  40. }  
  41. else  
  42. {  
  43. CDialog::OnSysCommand(nID, lParam);  
  44. }  
  45. }  
  46. void CIPAddressDlg::OnPaint()  
  47. {  
  48. if (IsIconic())  
  49. {  
  50. CPaintDC dc(this); // device context for painting  
  51.  
  52. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);  
  53. int cxIcon = GetSystemMetrics(SM_CXICON);  
  54. int cyIcon = GetSystemMetrics(SM_CYICON);  
  55. CRect rect;  
  56. GetClientRect(&rect);  
  57. int x = (rect.Width() - cxIcon + 1) / 2;  
  58. int y = (rect.Height() - cyIcon + 1) / 2;  
  59. dc.DrawIcon(x, y, m_hIcon);  
  60. }  
  61. else  
  62. {  
  63. CDialog::OnPaint();  
  64. }  

(2) 在檔案IPAddressDlg.cpp中編寫函數GetLocalHostName()擷取機器名,調用函數GetIPAddress()擷取機器的IP地址。具體代碼如下:

  1. int CIPAddressDlg::GetLocalHostName(CString &sHostName)  
  2. {  
  3. char szHostName[256];  
  4. int  nRetCode;  
  5. nRetCode = gethostname(szHostName, sizeof(szHostName));  
  6. if (nRetCode != 0) {  
  7. sHostName = _T("Not available");;  
  8. return WSAGetLastError();  
  9. }  
  10. sHostName = szHostName;  
  11. return 0;  
  12. }  
  13.  
  14. int CIPAddressDlg::GetIPAddress(const CString &sHostName,  
  15. CString &sIPAddress)  
  16. {  
  17. struct hostent FAR *lpHostEnt = gethostbyname(sHostName);  
  18. if (lpHostEnt == NULL) {  
  19. sIPAddress = _T("");  
  20. return WSAGetLastError();  
  21. }  
  22. LPSTR lpAddr = lpHostEnt->h_addr_list[0];  
  23. if (lpAddr) {  
  24. struct in_addr  inAddr;  
  25. memmove(&inAddr, lpAddr, 4);  
  26. sIPAddress = inet_ntoa(inAddr);  
  27. if (sIPAddress.IsEmpty())  
  28. sIPAddress = _T("Not available");  
  29. }  
  30.  
  31. return 0;  

 

(3) 在檔案IPAddressDlg.cpp中載入Winsock庫並釋放控制項,具體代碼如下:

  1. int CIPAddressDlg::StartUp()  
  2. {  
  3. WORD  wVersionRequested;  
  4. WSADATA wsaData;  
  5. int err;  
  6. wVersionRequested = MAKEWORD(2, 0);  
  7. err = WSAStartup(wVersionRequested, &wsaData);  
  8. if (err != 0) {  
  9. return err;  
  10. }  
  11. if (LOBYTE(wsaData.wVersion) != 2  
  12. || HIBYTE(wsaData.wVersion) != 0) {  
  13. WSACleanup();  
  14. return WSAVERNOTSUPPORTED;  
  15. }  
  16. return 0;  

 

至此整個執行個體的主要模組介紹完畢,執行後將擷取機器名和IP地址,1-14所示。

 
圖1-14  執行效果

 

小試牛刀--編程實現擷取電腦的IP地址和電腦名稱

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.