Как получить количество открытых TCP-соединений, удерживаемых определенным процессом в .NET - PullRequest
4 голосов
/ 23 марта 2011

Мне нужно отслеживать количество открытых TCP-соединений, удерживаемых одним процессом на 64-разрядной машине Windows 7 из .NET 4.0.

В этой статье описывается недокументированный метод Win32 API «AllocateAndGetTcpExTableFromStack», который выполняет эту задачу.задание на 32-битных окнах:

http://www.codeproject.com/KB/IP/iphlpapi.aspx?display=Print

Но это не удается на моей машине (предположительно, потому что я на 64-битной) с:

Невозможно найтиточка входа с именем «AllocateAndGetTcpExTableFromStack» в DLL «iphlpapi.dll».

Как мы можем это сделать в 64-битной Windows?

1 Ответ

4 голосов
/ 23 марта 2011

Вы можете получить хорошее начало через System.Net.NetworkInformation . В частности, IPGlobalProperties.GetActiveTcpConnections .

Однако вы обнаружите, что эта библиотека не предоставляет PID, поэтому нет способа сузить его с помощью конкретного процесса, связанного с каждым соединением. Я предполагаю, что будет гораздо проще просто проанализировать вывод консоли netstat -ano в коллекцию управляемых объектов и использовать простой запрос LINQ для извлечения конкретных соединений, которые вам нужны, на основе идентификатора процесса. Однако я не рекомендовал бы это, если вы собираетесь делать это часто, поскольку это будет очень медленный метод.

Вы также можете попробовать PInvoke для GetExtendedTcpTable() в DLL, на которую вы ссылаетесь выше. У меня нет своего x64-бокса для тестирования, но это может быть простым устареванием конкретной функции, которую вы пытаетесь вызвать.

...