5

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
4

7 に答える 7

6

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

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

それらすべてのドキュメントはMSDNで検索してください。

于 2008-10-21T09:04:52.560 に答える
2

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

おそらくよりポータブルである他のいくつかのアプローチがあります:-

  • SNMP。コンピューターでSNMPを有効にする必要がありますが、リモートコンピューターの統計を取得するためにも使用できることは明らかです。
  • 'netstat'の出力をアプリケーションにパイプし、テキストから値の選択を解除します。
于 2008-10-21T09:06:51.883 に答える
2

別のフォーラムで同じことを尋ねたので、自分自身に答えさせてください。

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");
        ...
于 2008-10-21T16:28:27.063 に答える
1

Szia、

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

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

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

于 2008-10-21T08:58:51.883 に答える
1

Win32_PerfRawData_Tcpip_NetworkInterfaceなどの実行可能なWMIパフォーマンスカウンターが見つかる場合があります。

于 2008-10-21T09:06:17.703 に答える
0

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

于 2008-10-21T16:03:19.640 に答える