2013-01-25 80 views
1

我想在我的C#應用​​程序中按流程測量帶寬網絡。如何測量上傳和下載網絡利用程序在Windows XP上的過程在C#中的Windows 8?

我試圖在Process Object中找到這些信息,但是這個信息不存在。

我已經嘗試使用性能計數器,但是我沒有按進程找到帶寬信息。

你有沒有采取措施的想法網絡捆紮(網絡字節發送,接收的網絡字節)由工藝應用工作在Windows XP升級到Windows 8?

我知道Windows系統有這個信息,因爲當我們打開「資源監視器」,我可以選擇在網絡選項卡特定的應用程序,我們可以看到的字節數和發送實時接收。

謝謝。

回答

4

據我所知你不能用純粹的C#做這個,你將不得不做一些P/Invoke調用到IP助手庫中。

因爲這非常重要,所以我將簡要概述您需要製作的API調用。

首先,這將不會在Windows XP上運行的一些API是新的(這就是爲什麼資源監視器沒有該版本存在)。如果你需要Windows XP支持,你將不得不使用WinPCap這樣的東西。在Vista +上,隨着我們需要的新的網絡信息調用,事情會變得更好。

有對IPv4,IPv6,TCP和UDP的單獨呼叫。爲了簡潔起見,我將簡要地概述IPv4/TCP集,因爲一旦您瞭解了可以輕鬆複製以填充其他部分的過程。

要開始,你將需要調用GetTcpTable2()。這會爲您提供機器上當前處於活動狀態的連接表。你最終會得到一個MIB_TCPTABLE2和一堆MIB_TCPROW2結構。每個結構代表一個連接。

MIB_TCPROW2結構具有PID字段,您可以與您的當前進程ID。

因此,這意味着不斷輪詢連接表,重複它並轉儲出與您的進程相關的行。

對於這些行,你便要打電話GetPerTcpConnectionEStats()。有兩種你會感興趣的stat類型,第一個​​返回有關發送和接收字節數的信息。第二個TcpConnectionEstatsBandwidth返回有關連接帶寬的信息。

我之所以沒有爲此展示任何代碼的原因是它的參與並涉及很多結構編組,但希望我已經給了你比現在更多的東西。

下面是聯結到MSDN爲這些功能:

GetTcpTable2() - http://msdn.microsoft.com/en-us/library/bb408406(v=vs.85).aspx GetPerTcpConnectionEStats() - http://msdn.microsoft.com/en-us/library/bb485738(v=vs.85).aspx

+0

偉大的!感謝您的解釋:) –

+0

如何在Delphi中做到這一點? – 2013-09-18 15:18:10

+0

@EricSantos實現相同的API,適用相同的原則。幸運的是,你不會像在.NET中那樣做一半的編組。 – Lloyd

0

在C#GetTcpTable2()一個簡單的例子。

[DllImport("iphlpapi.dll", SetLastError = true)] 
static extern int GetTcpTable2(byte[] pTcpTable, out int pdwSize, bool bOrder); 

static void Main(string[] args) { 
    int pdwSize = 20000; 
    byte[] buffer = new byte[pdwSize]; 
    int res = GetTcpTable2(buffer, out pdwSize, true); 
    if (res != 0) { 
    buffer = new byte[pdwSize]; 
    res = GetTcpTable2(buffer, out pdwSize, true); 
    if (res != 0) throw new Exception(res); 
    } 

    int nOffset = 0; 
    var dwNumEntries = Convert.ToInt32(buffer[nOffset]); nOffset += 4; 
    Console.WriteLine("total connection: {0}", dwNumEntries); 

    for (int i = 0; i < dwNumEntries; i++) { 
    Console.WriteLine("*****************"); 
    int st = Convert.ToInt32(buffer[nOffset]); 
    Console.WriteLine("state: {0}", st); nOffset += 4; 

    string LocalAdrr = buffer[nOffset].ToString() + "." + buffer[nOffset + 1].ToString() + "." 
     + buffer[nOffset + 2].ToString() + "." + buffer[nOffset + 3].ToString(); 
    Console.WriteLine("local ip: {0}", LocalAdrr); nOffset += 4; 

    int LocalPort = (((int)buffer[nOffset]) << 8) + (((int)buffer[nOffset + 1])) + 
     (((int)buffer[nOffset + 2]) << 24) + (((int)buffer[nOffset + 3]) << 16); 
    Console.WriteLine("local port: {0}", LocalPort); nOffset += 4; 

    string RemoteAdrr = buffer[nOffset].ToString() + "." + buffer[nOffset + 1].ToString() + "." 
     + buffer[nOffset + 2].ToString() + "." + buffer[nOffset + 3].ToString(); 
    Console.WriteLine("remote ip: {0}", RemoteAdrr); nOffset += 4; 

    int RemotePort = (RemoteAdrr == "0.0.0.0") ? 0 
     : RemotePort = (((int)buffer[nOffset]) << 8) + (((int)buffer[nOffset + 1])) + 
     (((int)buffer[nOffset + 2]) << 24) + (((int)buffer[nOffset + 3]) << 16); 
    Console.WriteLine("remote port: {0}", RemotePort); nOffset += 4; 

    int pid = BitConverter.ToInt32(buffer.Skip(nOffset).Take(4).ToArray(), 0); 
    Console.WriteLine("pid: {0}", pid); nOffset += 4; 

    int OffloadState = Convert.ToInt32(buffer[nOffset]); 
    Console.WriteLine("OffloadState: {0}", OffloadState); nOffset += 4; 
    } 

} 
相關問題