Como posso acessar netstat-like estatísticas Ethernet de um programa do Windows
-
03-07-2019 - |
Pergunta
Como posso acesso Ethernet estatísticas de código C / C ++ como 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
Solução
Um bom lugar para começar a estatísticas de rede seria o GetIpStatistics chamada nas funções do Windows IPHelper.
Há um par de outras abordagens que são possivelmente mais portátil: -
- SNMP. Requer SNMP a ser ativado no computador, mas, obviamente, pode ser usado para recuperar estatísticas para computadores remotos também.
- canalizar a saída do 'netstat' em sua aplicação, e desfazer os valores do texto.
Outras dicas
O WMI fornecemos a essas leituras:
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
Essas classes estão disponíveis no Windows XP ou mais recente. Você pode ter que renunciar à correspondência aulas "Win32_PerfRawData" no Windows 2000, e fazer um pouco mais de matemática antes de exibir a saída.
em todos eles em MSDN.
Deixe-me responder a mim mesmo, como eu pedi a mesma em outro fórum.
WMI é bom, mas é mais fácil de usar IpHlpApi vez:
#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
Na plataforma Windows, netstat informação pode ser recuperada por chamando o GetTcpTable e funções GetUdpTable no Helper IP API, ou Iphlpapi.dll. Em formação retornada inclui IP local e remoto endereços, locais e portas remotas, e (Para GetTcpTable) códigos de status TCP. No Além da linha de comando ferramenta netstat.exe que acompanha o netstat, não são baseadas em GUI do Windows programas disponíveis. Na plataforma Windows, este comando está disponível somente se o Internet Protocol (TCP / IP) protocolo é instalado como um componente no Propriedades de uma placa de rede em Conexões de rede.
Exemplo de MFC em CodeProject: http://www.codeproject.com/KB/ aplicações / wnetstat.aspx
Você pode encontrar um contador de desempenho feasable WMI , por exemplo, Win32_PerfRawData_Tcpip_NetworkInterface .
Ver Grupos do Google, o código fonte netstats originais foi postado muitas vezes (win32 api)
Como acima respostas sugerem, contadores de desempenho WMI contém alguns dados. Esteja ciente de que em versões posteriores do Windows os contadores perf são discriminadas em v4 vs v6 assim as consultas são:
* 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