5 Stimmen

Wie kann ich von einem Windows-Programm aus auf netstat-ähnliche Ethernet-Statistiken zugreifen?

Wie kann ich von C/C++-Code aus auf Ethernet-Statistiken zugreifen? netstat -e ?

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

6voto

Tomalak Punkte 320467

Das WMI wird diese Werte liefern:

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

Diese Klassen sind unter Windows XP oder neuer verfügbar. Unter Windows 2000 müssen Sie möglicherweise auf die entsprechenden "Win32_PerfRawData"-Klassen zurückgreifen und ein wenig mehr rechnen, bevor Sie die Ausgabe anzeigen können.

finden. Dokumentation über alle diese Themen im MSDN.

2voto

Roddy Punkte 64661

Eine gute Anlaufstelle für Netzwerkstatistiken wäre die GetIpStatistics Aufruf in den Windows IPHelper-Funktionen.

Es gibt noch einige andere Ansätze, die möglicherweise besser tragbar sind:-

  • SNMP. Erfordert, dass SNMP auf dem Computer aktiviert ist, kann aber natürlich auch zum Abrufen von Statistiken für entfernte Computer verwendet werden.
  • Leiten Sie die Ausgabe von 'netstat' in Ihre Anwendung ein, und entnehmen Sie die Werte aus dem Text.

2voto

Denes Tarjan Punkte 576

Ich möchte mir selbst antworten, da ich die gleiche Frage in einem anderen Forum gestellt habe.

WMI ist gut, aber es ist einfacher, stattdessen IpHlpApi zu verwenden:

#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");
        ...

1voto

Ilya Kochetov Punkte 17577

Szia,

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

Auf der Windows-Plattform wird netstat Informationen abgerufen werden, indem Aufruf der Funktionen GetTcpTable und GetUdpTable-Funktionen in der IP Helper API oder IPHLPAPI.DLL. Die Informationen zurückgegebenen Informationen umfassen lokale und entfernte IP Adressen, lokale und entfernte Ports und (für GetTcpTable) TCP-Statuscodes. Unter Zusätzlich zum Befehlszeilenprogramm netstat.exe, das zum Lieferumfang von Windows mitgeliefert wird, gibt es auch GUI-basierte netstat Programme zur Verfügung. Auf der Windows-Plattform ist dieser Befehl nur verfügbar, wenn das Internet Protokoll (TCP/IP) als Komponente als Komponente installiert ist in den Eigenschaften eines Netzwerkadapters in Netzwerk-Verbindungen.

MFC-Beispiel bei CodeProject: http://www.codeproject.com/KB/applications/wnetstat.aspx

1voto

VolkerK Punkte 93746

Vielleicht finden Sie eine machbare WMI-Leistungszähler z.B. Win32_PerfRawData_Tcpip_NetworkInterface .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X