Получение статистики пропускной способности для каждого соединения
Мне нужно определить статистику использования сети для каждого процесса, аналогичную тому, что может сделать 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 может помочь определить, как вызывать неуправляемый код.
Если бы я продолжал пробовать это, я бы попытался выяснить следующее:
- Как вызвать SetPerTcpConnectionEStats, чтобы разрешить сбор TcpConnectionEstatsBandwidth через соответствующий TCP_ESTATS_TYPE.
- Я бы использовал IPGlobalProperties.GetActiveTcpConnections, чтобы получить информацию, необходимую для создания MIB_TCPROW.
- Определите, как вызвать GetPerTcpConnectionEStats для мониторинга данных.