Получение статистики пропускной способности для каждого соединения

Мне нужно определить статистику использования сети для каждого процесса, аналогичную тому, что может сделать TCPView.

http://img513.imageshack.us/img513/861/6601f15814544055a590e26.png

Поэтому, прежде чем застрелить меня за публикацию дубликата этого вопроса или этого вопроса, я хотел бы отметить, что ни у одного из них нет подробного ответа, который мог бы помочь мне на самом деле сделать это.

Я проводил исследования, и есть много способов перечислить активные соединения и связанные с ними процессы, будь то с помощью netstat или других оконных API, таких как IpHlpAPI.dll.

Теперь, из того, что я сделал в Google, я не нашел много - за исключением этих расплывчатых терминов: GetPerTcpConnectionEStats и GetPerTcp6ConnectionEStats. Предположительно для TCP через IPv4 и IPv6 соответственно. Теперь, где я читал, якобы способен делать то, что мне нужно. Тем не менее, это все еще не учитывает UDP. И они также недоступны в системах XP, на которых работает TCPViewer.

Я был бы доволен их использованием для TCP, но проблема в том, что я не могу найти какие-либо примеры их использования из C#.

Итак, я думаю, все сводится к следующим вопросам:

  • Кто-нибудь на самом деле знает, как это делает TCPView?
  • Как я могу использовать GetPerTcpConnectionEStats для TCP? Или это может даже выполнить то, что я предлагаю?
  • Есть ли другая известная альтернатива, которая будет работать для UDP?

Весь смысл в том, чтобы увидеть независимое использование полосы пропускания самими процессами. Не рассчитать общую пропускную способность системы.

Заранее спасибо за любые ответы.

1 ответ

Я потратил немного времени, пытаясь выяснить, как я могу сделать что-то подобное (задержка по сравнению с пропускной способностью), но мне пришлось отказаться из-за нехватки времени для инвестиций. Я думал, что добавлю свои выводы здесь в надежде, что мы в итоге получим ответ.

Вам, очевидно, нужно будет использовать PInvoke, и я боюсь, что специфика выходит далеко за рамки моего опыта работы с ним.

Эта библиотека Wrapper в CodeProject использует AllocateAndGetTcpExTableFromStack, которая работает только в Windows XP и Server 2003. Она по-прежнему не обеспечивает пропускную способность, хотя извините.

Самая близкая информация, которую я мог найти в качестве отправной точки (для Vista/Server 2008 или новее), является примером на pinvoke.net для GetExtendedTcpTable.

Инструмент PInvoke Interop Assistant может помочь определить, как вызывать неуправляемый код.

Если бы я продолжал пробовать это, я бы попытался выяснить следующее:

  1. Как вызвать SetPerTcpConnectionEStats, чтобы разрешить сбор TcpConnectionEstatsBandwidth через соответствующий TCP_ESTATS_TYPE.
  2. Я бы использовал IPGlobalProperties.GetActiveTcpConnections, чтобы получить информацию, необходимую для создания MIB_TCPROW.
  3. Определите, как вызвать GetPerTcpConnectionEStats для мониторинга данных.
Другие вопросы по тегам