Получение статистики пропускной способности для каждого соединения - PullRequest
5 голосов
/ 11 марта 2012

Мне нужно определить статистику использования сети для каждого процесса, аналогично тому, что может делать 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 Ответ

1 голос
/ 18 мая 2012

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

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

В этой библиотеке оболочек на 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 для мониторинга данных.
...