c # - Få pr. forbindelse båndbredde statistik

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er nødt til at bestemme statistik pr. Proces netværksbrug, der ligner, hvad TCPView kan gøre.


Eksempel http://img513.imageshack.us/img513/861/6601f15814544055a590e26.png[1]


Så før du skyder mig for at sende et duplikat af dette spørgsmål, eller dette spørgsmål, vil jeg gerne påpege, at ingen af ​​dem har et grundigt svar, der kan hjælpe mig med at gøre det faktisk.


Jeg har gjort forskning, og der er tydeligvis mange måder at liste ud aktive forbindelser og deres tilknyttede processer, uanset om det er med netstat eller andre Windows API'er som IpHlpAPI.dll. [4]


Nu, hvad Google har gjort, har jeg ikke fundet meget - med undtagelse af disse vage udtryk: GetPerTcpConnectionEStats og GetPerTcp6ConnectionEStats . Formentlig for henholdsvis TCP over IPv4 og IPv6. Nu hvor jeg læste det skulle kunne gøre hvad jeg skal gøre. Men det forlader stadig UDP. Og de er heller ikke tilgængelige på XP-systemer, som TCPViewer virker på. [5] [6]


Jeg ville være tilfreds med at bruge dem til TCP, men problemet er, jeg kan ikke synes at finde nogen eksempler på hvordan man bruger dem fra C #.


Så jeg tror det hele koger ned til disse få spørgsmål:



  • Er der nogen, der faktisk ved, hvordan TCPView gør det?

  • Hvordan bruger jeg GetPerTcpConnectionEStats til TCP? Eller kan det endda gøre det, jeg foreslår?

  • Er der et andet kendt alternativ, der ville fungere for UDP?



Hele punktet er at se selve processernes selvstændige båndbreddebrug. Ikke bereg den samlede systembåndbreddeforbrug.


På forhånd tak for alle svar.

Bedste reference


Jeg har brugt lidt tid på at prøve at finde ud af, hvordan jeg gør noget lignende (latens vs båndbredde), men har måttet opgive på grund af manglende tid til at investere. Jeg troede, at jeg vil tilføje mine resultater her i håb om at vi til sidst få et svar.


Du skal naturligvis bruge PInvoke og jeg er bange for, at detaljerne er langt ud over min erfaring med det.


Dette Wrapper-bibliotek på CodeProject bruger AllocateAndGetTcpExTableFromStack, som kun virker på Windows XP og Server 2003. Det får stadig dig båndbredde, desværre. [7] [8]


Den nærmeste information, jeg kunne finde som udgangspunkt (for Vista/Server 2008 eller nyere) er et eksempel på pinvoke.net for GetExtendedTcpTable. [9]


Værktøjet PInvoke Interop Assistant kan hjælpe med at bestemme, hvordan man kalder den ustyrede kode. [10]


Hvis jeg skulle fortsætte med at prøve dette, forsøger jeg at finde ud af følgende:



  1. Sådan kalder du [11] SetPerTcpConnectionEStats for at aktivere indsamling af TcpConnectionEstatsBandwidth via den relevante [12] TCP\_ESTATS\_TYPE.

  2. Jeg bruger [13] IPGlobalProperties.GetActiveTcpConnections for at få de oplysninger, der er nødvendige for at oprette en [14] MIB\_TCPROW.

  3. Bestem, hvordan du skal ringe [15] GetPerTcpConnectionEStats for at overvåge dataene.