• 小试牛刀--编程实现获取计算机的IP地址和计算机名


    1.2.3  小试牛刀--编程实现获取计算机的IP地址和计算机名(1)

    实例功能 获取当前计算机的IP地址和计算机名

    源码路径 光盘yuanma1IP

    本实例的目的是,使用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 ", nRetCode);  
    24. nRetCode = GetLocalHostName(m_sHostName);  
    25. TRACE1("GetLocalHostName RetCode: %d ", nRetCode);  
    26. nRetCode = GetIPAddress(m_sHostName, m_sIPAddress);  
    27. TRACE1("GetIPAddress RetCode: %d ", nRetCode);  
    28. nRetCode = CleanUp();  
    29. TRACE1("CleanUp RetCode: %d ", 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  执行效果
  • 相关阅读:
    如何更好的发现问题
    【刷题 Python Tip】题目6~10
    No module named MYSQLdb 问题解决
    第一个python爬虫,爬取百度图片
    【刷题 Python Tip】题目1~5
    Python sql数据的增删改查简单操作
    一个简单的flask程序
    open函数
    句柄的创建
    内核对象
  • 原文地址:https://www.cnblogs.com/For-her/p/3939339.html
Copyright © 2020-2023  润新知