1

C# アプリケーションでプロセスごとにネットワーク帯域幅を測定したいと考えています。

プロセス オブジェクトでこの情報を見つけようとしましたが、この情報は存在しません。

私も Performance Counter を使用しようとしましたが、プロセスごとの帯域幅情報が見つかりません。

Windows XP から Windows 8 でアプリケーションが動作するプロセスで、ネットワーク バンディング (送信ネットワーク バイト数、受信ネットワーク バイト数) を測定するアイデアはありますか?

「リソースモニター」を開くと、ネットワークタブで特定のアプリケーションを選択でき、送受信されたバイト数をリアルタイムで確認できるため、Windowsがこの情報を持っていることを知っています。

ありがとう。

4

2 に答える 2

5

私の知る限り、純粋なC#ではこれを行うことができないため、IPヘルパーライブラリに対してP/Invoke呼び出しを行う必要があります。

これは非常に複雑なので、行う必要のあるAPI呼び出しの概要を簡単に説明します。

まず、一部のAPIが新しいため、これはWindows XPでは機能しません(そのため、そのバージョンにはResource Monitorが存在しません)。Windows XPのサポートが必要な場合は、WinPCapのようなものを使用する必要があります。Vista +では、新しいネットワーク情報呼び出しを行うことで状況が改善されます。

IPv4、IPv6、TCP、UDPには別々の呼び出しがあります。簡潔にするために、IPv4 / TCPセットの概要を説明します。プロセスを理解したら、他の部分を埋めるために簡単に複製できるからです。

開始するには、を呼び出す必要がありますGetTcpTable2()。これにより、マシンで現在アクティブな接続のテーブルが表示されます。MIB_TCPTABLE2とたくさんのMIB_TCPROW2構造物ができあがります。各構造は接続を表します。

構造には、MIB_TCPROW2現在のプロセスIDと照合できるPIDフィールドがあります。

つまり、接続テーブルを継続的にポーリングし、それを繰り返して、プロセスに関連する行をダンプすることを意味します。

これらの行ごとに、を呼び出す必要がありますGetPerTcpConnectionEStats()。関心のある2つの統計タイプがあります。1つ目TcpConnectionEstatsDataは、送受信されたバイト数に関する情報を返します。2つ目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

于 2013-01-25T14:06:41.577 に答える