Windows 프로그램에서 NetStat와 같은 이더넷 통계에 액세스하려면 어떻게해야합니까?

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

문제

C/C ++ 코드에서 이더넷 통계에 액세스하려면 어떻게해야합니까? 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
도움이 되었습니까?

해결책

네트워크 통계를 시작하기에 좋은 곳은 GetIpStatistics Windows Iphelper 함수에서 호출하십시오.

더 휴대 성이있는 몇 가지 다른 접근법이 있습니다.

  • 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 또는 새로 제공됩니다. Windows 2000에서 일치하는 "Win32_perfrawdata"클래스에 사임해야 할 수도 있고 출력을 표시하기 전에 약간의 수학을 수행해야 할 수도 있습니다.

찾다 그들 모두에 대한 문서 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 플랫폼에서 IP 도우미 API 또는 iphlpapi.dll에서 gettcptable 및 getudptable 함수를 호출하여 Netstat 정보를 검색 할 수 있습니다. 반환 된 정보에는 로컬 및 원격 IP 주소, 로컬 및 원격 포트 및 (GetTCptable의 경우) TCP 상태 코드가 포함됩니다. Windows와 함께 제공되는 명령 줄 netstat.exe 도구 외에도 GUI 기반 NETSTAT 프로그램이 있습니다. Windows 플랫폼 에서이 명령은 인터넷 프로토콜 (TCP/IP) 프로토콜이 네트워크 연결에서 네트워크 어댑터의 속성에 구성 요소로 설치된 경우에만 사용할 수 있습니다.

CodeProject의 MFC 샘플 : http://www.codeproject.com/kb/applications/wnetstat.aspx

당신은 가능할 수 있습니다 WMI 성능 카운터, 예를 들어 win32_perfrawdata_tcpip_networkinterface.

Google Groups를 참조하십시오. 원래 Netstats 소스 코드가 여러 번 게시되었습니다 (Win32 API)

위의 답변이 제안한 바와 같이, WMI 성능 카운터에는 일부 데이터가 포함되어 있습니다. 이후의 Windows 버전에서 성능 카운터는 v4 vs v6에서 분류되므로 쿼리는 다음과 같습니다.

win32_perfformatteddata_tcpip_ipv4에서 *를 선택하십시오

win32_perfformatteddata_tcpip_tcpv4에서 *를 선택하십시오

win32_perfformatteddata_tcpip_udpv4에서 *를 선택하십시오

win32_perfformatteddata_tcpip_icmp에서 *를 선택하십시오

win32_perfformatteddata_tcpip_ipv6에서 *를 선택하십시오

win32_perfformatteddata_tcpip_tcpv6에서 *를 선택하십시오

win32_perfformatteddata_tcpip_udpv6에서 *를 선택하십시오

win32_perfformatteddata_tcpip_icmpv6에서 *를 선택하십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top