开发者

monitor internet usage in .net

开发者 https://www.devze.com 2023-02-02 18:58 出处:网络
I want to write a method in C# to check which applications in my machine/server are using internet connection at a particular poin开发者_JAVA百科t in time and if possible, how much bandwidth they are

I want to write a method in C# to check which applications in my machine/server are using internet connection at a particular poin开发者_JAVA百科t in time and if possible, how much bandwidth they are using. Can anyone please help me get a head start on this?


I decided to write an answer because comments are too small.

Well, reading other Q&A on stackoverflow and looking around on the internet, I didn't find a simple solution for your problem.

Actually, for .NET processes is really simple, you just need to retrieve informations from ".NET CLR Networking - Bytes Received/Bytes Sent" performance counters, as shown in this Q&A

But in general, getting per-process used bandwidth isn't an easy work.

For example "Microsoft Network Monitor" sniffer can trace the process that generates internet packets only for TCP traffic, because probably it maps IP-port pairs with processes using them (or something similar, TCP is a connected protocol so it is simpler).
Anyway if you want to give it a try you can use the exposed API (look at this blog entry for some hint).

However, as suggested in these Q&A's (LINK 1, LINK 2), the right, and probably the only way, is to write a NDIS/TDI driver that can intercept network traffic and exposing a .NET callable API to it.

The problem is that such drivers can't be written in managed code, and so you need to implement it in C/C++.
Obviously, if you manage to find an already written driver/sniffer exposing a callable API, you can use it.
For example WinPCap has one (and some .NET wrappers like SharpPCap or PCap.Net), but I don't think (not sure) it's able to get packets's source-process information.


As digEmAll noted, in pre-Vista Windows you are reduced to writing your own driver or using a 3-rd party one. In Vista, 2008 and Windows 7 you can use the GetPerTcpConnectionEStats API (there is a large example of its usage on the MSDN page). Resource Monitor relies on this API, together with the older GetTcpTable/GetTcpRow APIs, for extended network statistics.


I found Process Monitor as a very useful tool and it served my purpose so I didnt had to write any code although i am yet to check out whether it gives any API which i can use in my application to get some information I need.

Thanks everyone for helping me out.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号