欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++實(shí)現(xiàn)枚舉網(wǎng)上鄰居信息的示例詳解

 更新時(shí)間:2023年12月06日 08:45:15   作者:微軟技術(shù)分享  
在Windows系統(tǒng)中,通過網(wǎng)絡(luò)鄰居可以方便地查看本地網(wǎng)絡(luò)中的共享資源和計(jì)算機(jī),本文將介紹一個(gè)簡(jiǎn)單的C++程序,使用Windows API枚舉網(wǎng)絡(luò)鄰居信息,并獲取對(duì)端名稱、本機(jī)名稱、主機(jī)名稱以及主機(jī)IP等信息,文中通過代碼示例給大家講解非詳細(xì),需要的朋友可以參考下

在Windows系統(tǒng)中,通過網(wǎng)絡(luò)鄰居可以方便地查看本地網(wǎng)絡(luò)中的共享資源和計(jì)算機(jī)。通過使用Windows API中的一些網(wǎng)絡(luò)相關(guān)函數(shù),我們可以實(shí)現(xiàn)枚舉網(wǎng)絡(luò)鄰居信息的功能,獲取連接到本地網(wǎng)絡(luò)的其他計(jì)算機(jī)的相關(guān)信息。本文將介紹一個(gè)簡(jiǎn)單的C++程序,使用Windows API枚舉網(wǎng)絡(luò)鄰居信息,并獲取對(duì)端名稱、本機(jī)名稱、主機(jī)名稱以及主機(jī)IP等信息。

引言

首先,我們需要了解一下幾個(gè)與網(wǎng)絡(luò)鄰居信息有關(guān)的Windows API函數(shù):

NETRESOURCE 結(jié)構(gòu)體是 Windows 網(wǎng)絡(luò) API 中的一個(gè)結(jié)構(gòu)體,用于描述網(wǎng)絡(luò)資源的信息。它在網(wǎng)絡(luò)資源的枚舉和連接等操作中經(jīng)常被使用。

結(jié)構(gòu)體定義

typedef struct _NETRESOURCE {
  DWORD         dwScope;
  DWORD         dwType;
  DWORD         dwDisplayType;
  DWORD         dwUsage;
  LPTSTR        lpLocalName;
  LPTSTR        lpRemoteName;
  LPTSTR        lpComment;
  LPTSTR        lpProvider;
} NETRESOURCE, *LPNETRESOURCE;

結(jié)構(gòu)體成員

  • dwScope:指定資源的可見性??赡艿娜≈禐椋?
    • RESOURCE_CONNECTED:表示已連接的資源。
    • RESOURCE_CONTEXT:表示會(huì)話特定的資源。
  • dwType:指定資源的類型。可能的取值為:
    • RESOURCETYPE_ANY:表示任何類型的資源。
    • RESOURCETYPE_DISK:表示磁盤資源。
    • RESOURCETYPE_PRINT:表示打印機(jī)資源。
  • dwDisplayType:指定資源的顯示類型??赡艿娜≈禐椋?ul>
  • RESOURCEDISPLAYTYPE_GENERIC:表示通用資源。
  • RESOURCEDISPLAYTYPE_DOMAIN:表示域。
  • dwUsage:指定資源的使用類型??赡艿娜≈禐椋?ul>
  • RESOURCEUSAGE_CONNECTABLE:表示資源可以連接。
  • RESOURCEUSAGE_CONTAINER:表示資源是一個(gè)容器,可以包含其他資源。
  • lpLocalName:指定本地驅(qū)動(dòng)器或打印機(jī)的本地名稱。
  • lpRemoteName:指定遠(yuǎn)程共享資源的網(wǎng)絡(luò)名稱。
  • lpComment:指定資源的注釋。
  • lpProvider:指定提供資源的網(wǎng)絡(luò)提供程序的名稱。
  • WNetOpenEnum 是 Windows 網(wǎng)絡(luò)功能中的一個(gè)API函數(shù),WNetOpenEnum 通過指定的參數(shù)打開一個(gè)用于列舉網(wǎng)絡(luò)資源的枚舉句柄。這個(gè)句柄可以在后續(xù)的操作中用于獲取網(wǎng)絡(luò)資源的枚舉信息。

    函數(shù)原型

    DWORD WNetOpenEnum(
      DWORD         dwScope,
      DWORD         dwType,
      DWORD         dwUsage,
      LPNETRESOURCE lpNetResource,
      LPHANDLE      lphEnum
    );
    

    參數(shù)說明

    • dwScope:指定枚舉的范圍,可以是 RESOURCE_CONNECTED、RESOURCE_GLOBALNET、RESOURCE_REMEMBERED、RESOURCE_CONTEXT 中的一個(gè)。
    • dwType:指定枚舉資源的類型,可以是 RESOURCETYPE_DISK、RESOURCETYPE_PRINTRESOURCETYPE_ANY 中的一個(gè)。
    • dwUsage:指定枚舉資源的使用類型,可以是 RESOURCEUSAGE_CONNECTABLE、RESOURCEUSAGE_CONTAINERRESOURCEUSAGE_NOLOCALDEVICE、RESOURCEUSAGE_SIBLING 中的一個(gè)。
    • lpNetResource:指向 NETRESOURCE 結(jié)構(gòu)的指針,用于指定枚舉的起始位置。如果為 NULL,則從所有資源的最頂層開始枚舉。
    • lphEnum:指向句柄的指針,用于接收枚舉句柄。

    返回值

    如果函數(shù)調(diào)用成功,返回 NO_ERROR,否則返回一個(gè)錯(cuò)誤代碼,可以通過 GetLastError 函數(shù)獲取詳細(xì)信息。

    WNetEnumResource 是 Windows 網(wǎng)絡(luò)功能中的 API 函數(shù)之一,用于通過枚舉句柄獲取網(wǎng)絡(luò)資源的詳細(xì)信息,包括資源的類型、用途、本地名、遠(yuǎn)程名等信息。

    函數(shù)原型

    DWORD WNetEnumResource(
      HANDLE  hEnum,
      LPDWORD lpcCount,
      LPVOID  lpBuffer,
      LPDWORD lpBufferSize
    );
    

    參數(shù)說明

    • hEnum:枚舉句柄,通過 WNetOpenEnum 函數(shù)獲取的句柄。
    • lpcCount:指向一個(gè)變量的指針,該變量用于接收枚舉的資源數(shù)目。
    • lpBuffer:指向一個(gè)緩沖區(qū)的指針,用于接收枚舉的資源信息。
    • lpBufferSize:指向一個(gè)變量的指針,該變量用于指定或接收緩沖區(qū)的大小。

    返回值

    如果函數(shù)調(diào)用成功,返回 NO_ERROR,否則返回一個(gè)錯(cuò)誤代碼,可以通過 GetLastError 函數(shù)獲取詳細(xì)信息。

    WNetCloseEnum 函數(shù)用于關(guān)閉由 WNetOpenEnum 函數(shù)打開的網(wǎng)絡(luò)資源的枚舉句柄。在使用 WNetOpenEnum 函數(shù)枚舉網(wǎng)絡(luò)資源后,當(dāng)不再需要使用枚舉句柄時(shí),應(yīng)該通過調(diào)用 WNetCloseEnum 函數(shù)來釋放資源,避免內(nèi)存泄漏。

    函數(shù)定義

    DWORD WNetCloseEnum(
      HANDLE hEnum
    );
    

    參數(shù)

    • hEnum:網(wǎng)絡(luò)資源的枚舉句柄,該句柄是由 WNetOpenEnum 函數(shù)返回的。

    返回值

    如果函數(shù)調(diào)用成功,返回 NO_ERROR,否則返回錯(cuò)誤代碼,可以通過 GetLastError 函數(shù)獲取詳細(xì)的錯(cuò)誤信息。

    代碼實(shí)現(xiàn)

    以下是一個(gè)簡(jiǎn)單的C++程序,使用上述API函數(shù)實(shí)現(xiàn)了枚舉網(wǎng)絡(luò)鄰居信息的功能。該程序通過遍歷枚舉得到的網(wǎng)絡(luò)資源信息,獲取對(duì)端名稱、本機(jī)名稱、主機(jī)名稱以及主機(jī)IP等信息,并輸出到控制臺(tái)。

    #include <iostream>
    #include <Windows.h>
    #include <winnetwk.h>
    
    #pragma comment(lib,"Mpr.lib")
    #pragma comment(lib,"Ws2_32.lib")
    
    // 枚舉網(wǎng)絡(luò)鄰居
    BOOL EnumNetResource()
    {
      NETRESOURCE  *NetResource = NULL;
      HANDLE  hEnum;
      unsigned  int  i;
      char szHostName[MAX_PATH] = { 0 };
      hostent *host = NULL;
      char *lpszIP = NULL;
    
      // 通過WSAStartup函數(shù)完成對(duì)Winsock服務(wù)的初始化
      WSADATA wsaData = { 0 };
      WSAStartup(MAKEWORD(2, 2), &wsaData);
    
      // 指定枚舉范圍, 獲取枚舉句柄
      WNetOpenEnum(RESOURCE_CONTEXT, NULL, NULL, NULL, &hEnum);
      if (hEnum)
      {
        DWORD  Count = 0xFFFFFFFF;
        DWORD  BufferSize = 2048;
        BYTE *pBuffer = new  BYTE[2048];
    
        // 根據(jù)設(shè)置的枚舉返回, 獲取枚舉信息
        WNetEnumResource(hEnum, &Count, pBuffer, &BufferSize);
        NetResource = (NETRESOURCE*)pBuffer;
    
        for (i = 0; i < BufferSize / sizeof(NETRESOURCE); i++, NetResource++)
        {
          // 判斷資源類型是否是所有資源 以及 判斷資源使用類型是否是容器資源
          if (NetResource->dwUsage == RESOURCEUSAGE_CONTAINER  && NetResource->dwType == RESOURCETYPE_ANY)
          {
            if (NetResource->lpRemoteName)
            {
              // 獲取遠(yuǎn)程主機(jī)名
              RtlZeroMemory(szHostName, MAX_PATH);
              lstrcpy(szHostName, (char *)((DWORD64)NetResource->lpRemoteName + 2));
    
              // 根據(jù)主機(jī)名獲取IP地址信息
              host = gethostbyname(szHostName);
              if (host == NULL)
              {
                std::cout << "錯(cuò)誤代碼" << std::endl;
                continue;
              }
    
              // 將Ipv4網(wǎng)絡(luò)地址轉(zhuǎn)換為Internet標(biāo)準(zhǔn)點(diǎn)分十進(jìn)制格式的ASCII字符串
              lpszIP = inet_ntoa(*(in_addr *)host->h_addr_list[0]);
              std::cout << "對(duì)端名稱: " << NetResource->lpRemoteName
                << " 本機(jī)名稱: " << NetResource->lpLocalName
                << " 主機(jī)名稱: " << szHostName
                << " 主機(jī)IP: " << lpszIP
                << std::endl;
            }
          }
        }
    
        // 釋放內(nèi)存并關(guān)閉句柄
        delete[]pBuffer;
        pBuffer = NULL;
        WNetCloseEnum(hEnum);
      }
      return TRUE;
    }
    
    int main(int argc, char *argv[])
    {
      EnumNetResource();
    
      system("pause");
      return 0;
    }
    

    結(jié)語

    通過這個(gè)簡(jiǎn)單的程序,我們可以了解如何使用Windows API函數(shù)來枚舉網(wǎng)絡(luò)鄰居信息。這對(duì)于需要在程序中獲取網(wǎng)絡(luò)中其他計(jì)算機(jī)信息的場(chǎng)景是非常有用的。在實(shí)際應(yīng)用中,可以根據(jù)需要進(jìn)一步擴(kuò)展和優(yōu)化代碼,以滿足特定的功能需求。

    以上就是C/C++實(shí)現(xiàn)枚舉網(wǎng)上鄰居信息的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C/C++枚舉網(wǎng)上鄰居信息的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

    相關(guān)文章

    • Qt實(shí)現(xiàn)Flappy Bird游戲

      Qt實(shí)現(xiàn)Flappy Bird游戲

      這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)Flappy Bird游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
      2018-12-12
    • C++關(guān)于Makefile的詳解含通用模板

      C++關(guān)于Makefile的詳解含通用模板

      今天小編就為大家分享一篇關(guān)于C++關(guān)于Makefile的詳解含通用模板,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
      2018-12-12
    • C++常見錯(cuò)誤中英文對(duì)照表

      C++常見錯(cuò)誤中英文對(duì)照表

      對(duì)于剛學(xué)編程,剛接觸C++的新手來說,編譯運(yùn)行報(bào)錯(cuò)是最頭疼的一件事,爆出一堆英文,英語差一點(diǎn)的又不知道什么意思,所以也不知道如何去改,在此,我給大家傳一份常見錯(cuò)誤中英文對(duì)照表及簡(jiǎn)單解釋,希望可以幫到大家
      2016-05-05
    • Linux下實(shí)現(xiàn)C++操作Mysql數(shù)據(jù)庫

      Linux下實(shí)現(xiàn)C++操作Mysql數(shù)據(jù)庫

      由于工作需要抽出一周的時(shí)間來研究C/C++訪問各種數(shù)據(jù)庫的方法,并打算封裝一套數(shù)據(jù)庫操作類,現(xiàn)在奉上最簡(jiǎn)單的一部分:在Linux下訪問MySQL數(shù)據(jù)庫。
      2017-05-05
    • C++改變編程入口為main函數(shù)

      C++改變編程入口為main函數(shù)

      這篇文章主要介紹了C++改變編程入口為main函數(shù)的方法的相關(guān)資料,需要的朋友可以參考下
      2015-06-06
    • 帶你從頭學(xué)習(xí)C++的封裝

      帶你從頭學(xué)習(xí)C++的封裝

      這篇文章主要為大家從頭學(xué)習(xí)了C++的封裝,使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
      2022-02-02
    • 詳解C標(biāo)準(zhǔn)庫堆內(nèi)存函數(shù)

      詳解C標(biāo)準(zhǔn)庫堆內(nèi)存函數(shù)

      在C/C++語言中,我們知道內(nèi)存分為這幾種:程序全局變量?jī)?nèi)存、棧內(nèi)存、堆內(nèi)存。其中堆內(nèi)存就是通過malloc(new)來分配的內(nèi)存,本文我們來探討一下C標(biāo)準(zhǔn)庫堆內(nèi)存函數(shù)。
      2021-06-06
    • C++簡(jiǎn)明圖解分析靜態(tài)成員與單例設(shè)計(jì)模式

      C++簡(jiǎn)明圖解分析靜態(tài)成員與單例設(shè)計(jì)模式

      與靜態(tài)數(shù)據(jù)成員不同,靜態(tài)成員函數(shù)的作用不是為了對(duì)象之間的溝通,而是為了能處理靜態(tài)數(shù)據(jù)成員,靜態(tài)成員函數(shù)沒有this指針。既然它沒有指向某一對(duì)象,也就無法對(duì)一個(gè)對(duì)象中的非靜態(tài)成員進(jìn)行默認(rèn)訪問
      2022-06-06
    • C語言之快速排序算法(遞歸Hoare版)介紹

      C語言之快速排序算法(遞歸Hoare版)介紹

      大家好,本篇文章主要講的是C語言之快速排序算法(遞歸Hoare版)介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
      2021-12-12
    • C++智能指針weak_ptr的作用詳解

      C++智能指針weak_ptr的作用詳解

      weak_ptr是一個(gè)智能指針,也是一個(gè)類模板,本文主要介紹了C++智能指針weak_ptr的作用詳解,具有一定的參考價(jià)值,感興趣的可以了解一下
      2023-08-08

    最新評(píng)論