2016-08-18 4 views
0

TcpClient/TcpListenerを使用してローカルマシン上の他のアプリケーションからのリクエストをリスンするためのC#アプリケーションを開発しました。今、どのプロセスが実際にリスナーに接続しているのかを判断する必要があります。TcpClient/TcpListenerのソースプロセスを見つける

GetExtendedTcpTableを使用して、どのプロセスがどのポートを使用しているかを確認するいくつかの例があります。しかし、それは私のリスナーへのすべての接続で実行するには非常に高価な操作になるようです。システムは誰が接続しているのかを知る必要があります。私はちょうどオブジェクトを介して公開された情報を見つけることができません。手を貸してくれるウィンスクの指導者?

+1

最悪の場合、常に 'netstat -no'を実行して結果を解析することができます。 –

+0

それも見た。しかし、やはり、すべてのTCP接続に1トンのオーバーヘッドが加わるようです。結局のところ、私は接続が変更されてからキャッシュすることはできません。 –

+0

それを考えると、Fiddlerはプロセスごとにフィルタリングすることができます。したがって、Fiddlerはトラフィックの減速を引き起こさないので、やや効率的な方法でデータを取得する方法が必要です。 –

答えて

0

私の知る限り、これに対応する管理APIはありません。唯一の選択肢は、Windows APIをpInvokeすることです。

Windows APIは "IPHlpApi.dll"と "IpHelperAPI.dll"で利用できますが、ポートを取得するために必要な部分は文書化されていません。

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

管理対象ラッパーのソースコードはhereです。

+0

残念ながら、一度に非常に多くのリクエストが発生しているため、この方法ではTcpListenerが話している特定のプロセスを特定できません。私がPInvokeから得たテーブルは、切断されすぎていて、私の聴いているエンドポイントに近づく最近のプロセスの1つを与えてくれるだけです。 –