Windowsプログラムからnetstatのようなイーサネット統計にアクセスするにはどうすればよいですか

StackOverflow https://stackoverflow.com/questions/221181

質問

netstat -e などのC / C ++コードからイーサネット統計にアクセスするにはどうすればよいですか?

Interface Statistics

                       Received            Sent

Bytes                      21010071        15425579
Unicast packets               95512           94166
Non-unicast packets           12510               7
Discards                          0               0
Errors                            0               3
Unknown protocols                 0
役に立ちましたか?

解決

ネットワーク統計を開始するのに適した場所は、 Windows IPHelper関数のGetIpStatistics 呼び出し。

より移植性の高い他のアプローチがいくつかあります:-

  • SNMP。コンピューターでSNMPを有効にする必要がありますが、明らかにリモートコンピューターの統計情報を取得するためにも使用できます。
  • 「netstat」の出力をアプリケーションにパイプし、テキストから値を選択解除します。

他のヒント

WMIはこれらの測定値を提供します:

SELECT * FROM Win32_PerfFormattedData_Tcpip_IP
SELECT * FROM Win32_PerfFormattedData_Tcpip_TCP
SELECT * FROM Win32_PerfFormattedData_Tcpip_UDP
SELECT * FROM Win32_PerfFormattedData_Tcpip_ICMP
SELECT * FROM Win32_PerfFormattedData_Tcpip_Networkinterface

これらのクラスは、Windows XP以降で使用できます。一致する" Win32_PerfRawData"に辞任する必要がある場合があります。 Windows 2000でクラスを作成し、出力を表示する前にもう少し計算を行います。

すべてのドキュメントを検索MSDN。

別のフォーラムで同じ質問をしたので、自分に答えさせてください。

WMIは優れていますが、代わりにIpHlpApiを使用する方が簡単です:

#include <winsock2.h>
#include <iphlpapi.h>

int main(int argc, char *argv[])
{

PMIB_IFTABLE pIfTable;
MIB_IFROW ifRow;
PMIB_IFROW pIfRow = &ifRow;
DWORD dwSize = 0;

// first call returns the buffer size needed
DWORD retv = GetIfTable(pIfTable, &dwSize, true);
if (retv != ERROR_INSUFFICIENT_BUFFER)
    WriteErrorAndExit(retv);
pIfTable = (MIB_IFTABLE*)malloc(dwSize);

retv = GetIfTable(pIfTable, &dwSize, true);
if (retv != NO_ERROR)
    WriteErrorAndExit(retv);

// Get index
    int i,j;
    printf("\tNum Entries: %ld\n\n", pIfTable->dwNumEntries);
    for (i = 0; i < (int) pIfTable->dwNumEntries; i++)
    {
        pIfRow = (MIB_IFROW *) & pIfTable->table[i];
        printf("\tIndex[%d]:\t %ld\n", i, pIfRow->dwIndex);
        printf("\tInterfaceName[%d]:\t %ws", i, pIfRow->wszName);
        printf("\n");
        printf("\tDescription[%d]:\t ", i);
        for (j = 0; j < (int) pIfRow->dwDescrLen; j++)
            printf("%c", pIfRow->bDescr[j]);
        printf("\n");
        ...

Szia、

http://en.wikipedia.org/wiki/Netstat

  

Windowsプラットフォームでは、netstat   情報を取得することができます   GetTcpTableを呼び出し、   IPヘルパーのGetUdpTable関数   API、またはIPHLPAPI.DLL。情報   返されるには、ローカルおよびリモートIPが含まれます   アドレス、ローカルおよびリモートポート、および   (GetTcpTableの場合)TCPステータスコード。に   コマンドラインに追加   付属のnetstat.exeツール   Windows、GUIベースのnetstatがあります   利用可能なプログラム。   Windowsプラットフォームでは、このコマンド   インターネットの場合のみ利用可能です   プロトコル(TCP / IP)プロトコルは   コンポーネントとしてインストールされます   ネットワークアダプタのプロパティ   ネットワーク接続。

CodeProjectのMFCサンプル: http://www.codeproject.com/KB/ applications / wnetstat.aspx

Googleグループをご覧ください。元のnetstatsソースコードが何度も投稿されています(win32 api)

上記の回答が示すように、WMIパフォーマンスカウンターにはいくつかのデータが含まれています。 Windowsの以降のバージョンでは、v4とv6でperfカウンターが分解されるため、クエリは次のようになります。

SELECT * FROM Win32_PerfFormattedData_Tcpip_IPv4

SELECT * FROM Win32_PerfFormattedData_Tcpip_TCPv4

SELECT * FROM Win32_PerfFormattedData_Tcpip_UDPv4

SELECT * FROM Win32_PerfFormattedData_Tcpip_ICMP

SELECT * FROM Win32_PerfFormattedData_Tcpip_IPv6

SELECT * FROM Win32_PerfFormattedData_Tcpip_TCPv6

SELECT * FROM Win32_PerfFormattedData_Tcpip_UDPv6

SELECT * FROM Win32_PerfFormattedData_Tcpip_ICMPv6

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top