Comment puis-je accéder aux statistiques Ethernet de type netstat à partir d'un programme Windows
-
03-07-2019 - |
Question
Comment accéder aux statistiques Ethernet à partir du code C / C ++, tel que 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
La solution
Un bon point de départ pour les statistiques réseau est le GetIpStatistics dans les fonctions Windows IPHelper.
Il existe quelques autres approches qui sont peut-être plus portables: -
- SNMP. Nécessite l'activation de SNMP sur l'ordinateur, mais peut évidemment aussi être utilisé pour récupérer des statistiques pour les ordinateurs distants.
- Transférez le résultat de "netstat" dans votre application, puis désélectionnez les valeurs dans le texte.
Autres conseils
Le WMI fournira ces lectures:
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
Ces classes sont disponibles sous Windows XP ou plus récent. Vous devrez peut-être renoncer à l'option " Win32_PerfRawData " correspondante. classes sur Windows 2000, et faire un peu plus de maths avant de pouvoir afficher la sortie.
Trouvez la documentation sur chacun d'entre eux dans le MSDN.
Laissez-moi répondre moi-même, comme je l'avais déjà demandé sur un autre forum.
WMI est bon, mais il est plus facile d'utiliser IpHlpApi à la place:
#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,
de http://en.wikipedia.org/wiki/Netstat
Sur la plate-forme Windows, netstat les informations peuvent être récupérées par appeler le GetTcpTable et Fonctions GetUdpTable dans l'IP Helper API ou IPHLPAPI.DLL. Information renvoyé inclut les adresses IP locale et distante adresses, ports locaux et distants, et (pour GetTcpTable) Codes d'état TCP. Dans ajout à la ligne de commande outil netstat.exe fourni avec Windows, il existe des netstat basés sur une interface graphique programmes disponibles. Sur la plate-forme Windows, cette commande est disponible uniquement si Internet Protocole (TCP / IP) est installé en tant que composant dans le propriétés d'une carte réseau dans Connexions réseau.
Exemple MFC dans CodeProject: http://www.codeproject.com/KB/ applications / wnetstat.aspx
Vous pourriez trouver un Win32_PerfRawData_Tcpip_NetworkInterface .
Voir Groupes Google, le code source netstats d'origine a été publié plusieurs fois (win32 api)
Comme suggéré ci-dessus, les compteurs de performance WMI contiennent des données. Sachez simplement que dans les versions ultérieures de Windows, les compteurs de performances sont ventilés dans v4 vs v6, de sorte que les requêtes sont les suivantes:
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