Как подсчитать количество байтов, отправленных и полученных на каждое соединение TCP (общесистемное)?

Например, последние версии TCPView имеют такую ​​функциональность: отображение байтов, отправленных / полученных для TCP-соединения (отсчет начинается при запуске TCPView). это возможно без перехвата пакетов? Windows предоставляет какой-либо API для этого? Я не нашел такой счетчик производительности

как перечислить все соединения описаны здесь

РЕДАКТИРОВАТЬ: TDI помогает получать статистику передачи по сокетам? NetBIOS? какие ссылки куда копать?

6 ответов

Решение

Я хочу также реализовать эту функцию, поэтому я обращаюсь к tcpview 3.0.2.

Я обнаружил, что tcpview использует счетчик производительности WMI MSNT_TcpIpInformation.

Но MSNT_TcpIpInformation официально не поддерживается в XP и 2003.

вот описание, на которое вы можете сослаться. http://www.scriptinternals.com/new/us/support/Internal/WMI_MSNT_TcpIpInformation.htm

Кстати, MSNT_TcpIpInformation не имеет информации о пакетах, поэтому tcpview просто увеличивает отправленные и проверенные пакеты каждый раз. вот разбирать:

CPU Disasm
Address   Hex dump          Command                                           Comments
0040B41B  |.  83E8 02       SUB EAX,2                                         ; Switch (cases 2..3, 3 exits)
0040B41E  |.  74 29         JE SHORT 0040B449
0040B420  |.  83E8 01       SUB EAX,1
0040B423  |.  75 40         JNE SHORT 0040B465
0040B425  |.  8B57 1C       MOV EDX,DWORD PTR DS:[EDI+1C]                     ; Case 3 of switch Tcpview.40B41B
0040B428  |.  0196 90060000 ADD DWORD PTR DS:[ESI+690],EDX
0040B42E  |.  119E 94060000 ADC DWORD PTR DS:[ESI+694],EBX
0040B434  |.  8386 C0060000 ADD DWORD PTR DS:[ESI+6C0],1
0040B43B  |.  119E C4060000 ADC DWORD PTR DS:[ESI+6C4],EBX
0040B441  |.  5E            POP ESI
0040B442  |.  5F            POP EDI
0040B443  |.  5D            POP EBP
0040B444  |.  5B            POP EBX
0040B445  |.  83C4 3C       ADD ESP,3C
0040B448  |.  C3            RETN
0040B449  |>  8B47 1C       MOV EAX,DWORD PTR DS:[EDI+1C]                     ; Case 2 of switch Tcpview.40B41B
0040B44C  |.  0186 78060000 ADD DWORD PTR DS:[ESI+678],EAX
0040B452  |.  119E 7C060000 ADC DWORD PTR DS:[ESI+67C],EBX
0040B458  |.  8386 A8060000 ADD DWORD PTR DS:[ESI+6A8],1
0040B45F  |.  119E AC060000 ADC DWORD PTR DS:[ESI+6AC],EBX
0040B465  |>  5E            POP ESI                                           ; Default case of switch Tcpview.40B41B
0040B466  |.  5F            POP EDI

В общем, я полностью изменил tcpview 3.0.2 и реализовал ту же функцию, что и я, в соответствии с тем, что я изучил.

tcpview использует ETW для мониторинга сетевой активности.

Ключевыми API являются StartTrace, OpenTrace, ProcessTrace.

Используйте KERNEL_LOGGER_NAME и включите флаги EVENT_TRACE_FLAG_NETWORK_TCPIP.

Затем вы можете получить данные о сетевой активности из EventCallback, а затем проанализировать их как TcpIp_TypeGroup1 и другие структуры. Согласно документу, эти структуры поддерживаются только из перспективы. Однако вы можете вызывать и использовать его в xp(думаю, из обратного) и 2003(моя среда - 2003, тестов на xp нет). Конечно, вы должны определить все эти структуры самостоятельно.

Из перспективы win предоставляет некоторые API для получения статистической информации по каждому соединению. Такие как GetPerTcpConnectionEStats, GetPerUdpConnectionEStats, вы можете получить более подробную информацию из MSDN.

Кроме того, из перспективы вы можете использовать RAW Socket, чтобы закончить ту же работу (точнее, я думаю). До Vista RAW Socket не может получать SEND-пакеты, жаль.

Проверьте пример проекта WinSock LSP по адресу http://connect.microsoft.com/WNDP/Downloads

Вы найдете образец в nonifslsp\sockinfo.cpp, который "иллюстрирует, как разработать многоуровневого поставщика услуг, способного подсчитывать все байты, передаваемые через сокет TCP/IP".

Это делает sysinternals версия netstat (netstatp). IIRC использует SNMP для сбора информации. Ищите в сети и найдите версию, которая вам удобна. Имена файлов: netstatp.c и netstatp.h
Sysinternals больше не публикует netstatp, о котором я знаю.

Вы также можете зайти сюда и получить tcpview и / или tcpconv, один из которых доступен в виде исходного кода.

Посмотрите на исходный код BitMeterOS, он работает на xp+. Вы также хотите посмотреть на TCPDump/Libpcap. оба из них контролируют сетевой трафик, libpcap, вероятно, будет тем, что вы после, хотя

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

Лучше всего было бы перехватывать вызовы API "send" и записывать сумму, отправляемую каждый раз. Хотя это действительно не стоит того, я уверен, что это сработает. Удачи!

Другие вопросы по тегам