2012-03-11 4 views
5

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

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

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

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

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

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

Так что я думаю, все это сводится к этим несколько вопросов:

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

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

Заранее благодарим за любые ответы.

+0

Скорее всего, вы можете сделать это через WMI/счетчики производительности, однако я лично считаю эти API довольно загадочными ... на всякий случай, когда вы не получите никаких хороших ответов и ищете дополнительные ключевые слова для google. –

+0

Любое решение для этого? –

+0

@TomerPeled: Я так и не нашел решение и отказался от проекта (так как это было лично). Если вы узнаете, как определить использование пропускной способности отдельных процессов, пожалуйста, отправьте его как ответ, и это может вызвать некоторые побуждения во мне, чтобы закончить мой старый проект :) – caesay

ответ

1

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

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

Этот Wrapper Library on 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 для контроля данных.