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地址和计算机名。具体代码如下:
- BOOL CIPAddressDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
- ASSERT(IDM_ABOUTBOX < 0xF000);
- CMenu *pSysMenu = GetSystemMenu(FALSE);
- if (pSysMenu != NULL)
- {
- CString strAboutMenu;
- strAboutMenu.LoadString(IDS_ABOUTBOX);
- if (!strAboutMenu.IsEmpty())
- {
- pSysMenu->AppendMenu(MF_SEPARATOR);
- pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
- }
- }
- // 设置对话框图标
- SetIcon(m_hIcon, TRUE); // 设置大图标
- SetIcon(m_hIcon, FALSE); // 设置小图标
- int nRetCode;
- nRetCode = StartUp();
- TRACE1("StartUp RetCode: %d\n", nRetCode);
- nRetCode = GetLocalHostName(m_sHostName);
- TRACE1("GetLocalHostName RetCode: %d\n", nRetCode);
- nRetCode = GetIPAddress(m_sHostName, m_sIPAddress);
- TRACE1("GetIPAddress RetCode: %d\n", nRetCode);
- nRetCode = CleanUp();
- TRACE1("CleanUp RetCode: %d\n", nRetCode);
- UpdateData(FALSE);
- return TRUE;
- }
- void CIPAddressDlg::OnSysCommand(UINT nID, LPARAM lParam)
- {
- if ((nID & 0xFFF0) == IDM_ABOUTBOX)
- {
- CAboutDlg dlgAbout;
- dlgAbout.DoModal();
- }
- else
- {
- CDialog::OnSysCommand(nID, lParam);
- }
- }
- void CIPAddressDlg::OnPaint()
- {
- if (IsIconic())
- {
- CPaintDC dc(this); // device context for painting
- SendMessage(WM_ICONERASEBKGND, (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();
- }
- }
(2) 在文件IPAddressDlg.cpp中编写函数GetLocalHostName()获取机器名,调用函数GetIPAddress()获取机器的IP地址。具体代码如下:
- int CIPAddressDlg::GetLocalHostName(CString &sHostName)
- {
- char szHostName[256];
- int nRetCode;
- nRetCode = gethostname(szHostName, sizeof(szHostName));
- if (nRetCode != 0) {
- sHostName = _T("Not available");;
- return WSAGetLastError();
- }
- sHostName = szHostName;
- return 0;
- }
- int CIPAddressDlg::GetIPAddress(const CString &sHostName,
- CString &sIPAddress)
- {
- struct hostent FAR *lpHostEnt = gethostbyname(sHostName);
- if (lpHostEnt == NULL) {
- sIPAddress = _T("");
- return WSAGetLastError();
- }
- LPSTR lpAddr = lpHostEnt->h_addr_list[0];
- if (lpAddr) {
- struct in_addr inAddr;
- memmove(&inAddr, lpAddr, 4);
- sIPAddress = inet_ntoa(inAddr);
- if (sIPAddress.IsEmpty())
- sIPAddress = _T("Not available");
- }
- return 0;
- }
(3) 在文件IPAddressDlg.cpp中载入Winsock库并释放控件,具体代码如下:
- int CIPAddressDlg::StartUp()
- {
- WORD wVersionRequested;
- WSADATA wsaData;
- int err;
- wVersionRequested = MAKEWORD(2, 0);
- err = WSAStartup(wVersionRequested, &wsaData);
- if (err != 0) {
- return err;
- }
- if (LOBYTE(wsaData.wVersion) != 2
- || HIBYTE(wsaData.wVersion) != 0) {
- WSACleanup();
- return WSAVERNOTSUPPORTED;
- }
- return 0;
- }
至此整个实例的主要模块介绍完毕,执行后将获取机器名和IP地址,如图1-14所示。
图1-14 执行效果 |
时间: 2024-11-05 16:23:53