vc获取本地计算机名称和IP

操作系统:win10

IDE:vs2019

涉及到的函数:gethostname,gethostbyname,inet_ntoa

涉及到的头文件:Windows.h

涉及到的库:WS2_32.lib

代码如下:

#include <iostream>
#include <Windows.h>

#pragma comment(lib, "WS2_32.lib")
int main()
{
    WSADATA wsadata;
    WSAStartup(MAKEWORD(2, 2), &wsadata);
    char szHostName[128];
    struct hostent* pHost;
    int i = 0;
   
    if (gethostname(szHostName, sizeof(szHostName)) == 0) {
        std::cout << "本地计算机名称是: " << szHostName << std::endl;
        pHost = gethostbyname(szHostName);
        for (i = 0; pHost != NULL && pHost->h_addr_list[i] != NULL;i++) {
            LPCSTR ip = inet_ntoa(*(struct in_addr*)pHost->h_addr_list[i]);
            std::cout << ip << std::endl;
        }
    }
    WSACleanup();
    return 0;
}

编译通过,运行如下图:

%title插图%num

在MFC中实现

布局:

%title插图%num

设置2个控件变量,分别是CHostName和CIPAddr

%title插图%num

代码部分:

双击布局中的获取按钮进入按钮事件函数,写如下代码即可

char szHostName[128];
struct hostent* pHost;
int i = 0;

if (gethostname(szHostName, sizeof(szHostName)) == 0) {
	CHostName.SetWindowText(CString(szHostName));
	pHost = gethostbyname(szHostName);
	for (i = 0; pHost != NULL && pHost->h_addr_list[i] != NULL; i++) {
		LPCSTR ip = inet_ntoa(*(struct in_addr*)pHost->h_addr_list[i]);
		CIPAddr.AddString((LPCTSTR)ip);
	}
}

截图一下我的获取按钮事件函数

%title插图%num

编译报错,原因是用到的这些gethostbyname和inet_ntoa函数已经过时了,应该用新的函数代替,我这儿直接在项目属性关闭了SDL检查,即可继续使用这些函数

运行成功,但获取时发现Listbox控件中的内容是乱码,于是将项目属性的字符集从Unicode编码字符集改成了多字节编码字符集就正常了

%title插图%num

最后运行,点击获取按钮,内容正常了

%title插图%num

发表回复