首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 實現 QQ 風格 IP 地址獲取與顯示:Winsock 基礎網絡編程實戰

     編輯:VC 教學

參考 QQ 2004 好友 IP 顯示功能,本文演示如何在 VC++ 中使用 Winsock API 獲取本機主機名、解析 IP 地址並格式化顯示,適合初學者理解網絡基礎編程流程。

核心步驟與代碼

1. 初始化 Winsock

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;
}

2. 獲取本機主機名

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;
}

3. 解析主機名獲取 IP

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;
}

4. 調用示例

if (StartUp() == 0) {
    CString host, ip;
    if (GetLocalHostName(host) == 0 && GetIPAddress(host, ip) == 0) {
        AfxMessageBox(_T("主機名: ") + host + _T("\nIP: ") + ip);
    }
    WSACleanup();
}

關鍵 API 說明

API用途
WSAStartup/WSACleanupWinsock 庫初始化/清理
gethostname獲取本機主機名
gethostbyname主機名解析為 hostent 結構(含 IP 列表)
inet_ntoain_addr 結構轉點分十進制字符串

擴展方向

  • 多網卡環境:遍歷 h_addr_list 顯示所有 IPv4 地址。
  • IP 反查地理位置:結合離線 IP 庫(如 QQWry.dat)或線上 API 解析城市/ISP。
  • 獲取遠端連接 IP:getpeername 於已連接 Socket 獲取對端地址。
  • IPv6 支援:改用 getaddrinfo/getnameinfo 族函數。

代碼在 VC++ 6.0 編譯通過,展示了從庫初始化到地址解析的最短路徑,是網絡編程入門的經典範例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved