參考 QQ 2004 好友 IP 顯示功能,本文演示如何在 VC++ 中使用 Winsock API 獲取本機主機名、解析 IP 地址並格式化顯示,適合初學者理解網絡基礎編程流程。
int StartUp() {
WSADATA wsaData;
WORD wVer = MAKEWORD(2, 0);
int err = WSAStartup(wVer, &wsaData);
if (err != 0) return err;
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0) {
WSACleanup();
return WSAVERNOTSUPPORTED;
}
return 0;
}
int GetLocalHostName(CString& strHost) {
char szHost[256];
int ret = gethostname(szHost, sizeof(szHost));
if (ret != 0) {
strHost = _T("Not available");
return WSAGetLastError();
}
strHost = szHost;
return 0;
}
int GetIPAddress(const CString& strHost, CString& strIP) {
struct hostent* pHost = gethostbyname(strHost);
if (!pHost) {
strIP = _T("");
return WSAGetLastError();
}
LPSTR pAddr = pHost->h_addr_list[0];
if (pAddr) {
struct in_addr inAddr;
memmove(&inAddr, pAddr, 4);
strIP = inet_ntoa(inAddr);
if (strIP.IsEmpty()) strIP = _T("Not available");
}
return 0;
}
if (StartUp() == 0) {
CString host, ip;
if (GetLocalHostName(host) == 0 && GetIPAddress(host, ip) == 0) {
AfxMessageBox(_T("主機名: ") + host + _T("\nIP: ") + ip);
}
WSACleanup();
}
| API | 用途 |
|---|---|
| WSAStartup/WSACleanup | Winsock 庫初始化/清理 |
| gethostname | 獲取本機主機名 |
| gethostbyname | 主機名解析為 hostent 結構(含 IP 列表) |
| inet_ntoa | in_addr 結構轉點分十進制字符串 |
h_addr_list 顯示所有 IPv4 地址。getpeername 於已連接 Socket 獲取對端地址。getaddrinfo/getnameinfo 族函數。代碼在 VC++ 6.0 編譯通過,展示了從庫初始化到地址解析的最短路徑,是網絡編程入門的經典範例。