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; }
编译通过,运行如下图:

在MFC中实现
布局:

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

代码部分:
双击布局中的获取按钮进入按钮事件函数,写如下代码即可
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); } }
截图一下我的获取按钮事件函数

编译报错,原因是用到的这些gethostbyname和inet_ntoa函数已经过时了,应该用新的函数代替,我这儿直接在项目属性关闭了SDL检查,即可继续使用这些函数
运行成功,但获取时发现Listbox控件中的内容是乱码,于是将项目属性的字符集从Unicode编码字符集改成了多字节编码字符集就正常了

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