如何计算每个TCP连接(系统范围)发送和接收的字节数?

时间:2011-01-16 12:20:59

标签: windows winapi network-programming

e.g。最新版本的TCPView具有以下功能:显示每个TCP连接发送/接收的字节数(启动TCPView时开始计数)。是否可能没有数据包嗅探? Windows是否为此提供任何API?我还没有找到这样的性能计数器

如何枚举所有连接的描述here

编辑:TDI是否有助于接收每插槽传输统计信息? NetBIOS的?任何链接在哪里挖?

6 个答案:

答案 0 :(得分:7)

所有,我基本上完全颠倒了tcpview 3.0.2,并根据我所学的内容实现了相同的功能。

tcpview使用ETW来监控网络活动。

关键API是StartTrace,OpenTrace,ProcessTrace。

使用KERNEL_LOGGER_NAME并启用EVENT_TRACE_FLAG_NETWORK_TCPIP标记。

然后,您可以从EventCallback检索网络活动数据,然后将其解析为TcpIp_TypeGroup1和其他结构。根据该文件,这些结构仅从vista支持。但是你可以在xp(从反向猜测)和2003(我的环境是2003,xp上没有测试)中调用和使用它。当然,你必须自己定义所有这些结构。

从vista,win提供了一些用于检索每个连接统计信息的API。如GetPerTcpConnectionEStats,GetPerUdpConnectionEStats,您可以从MSDN获取更多详细信息。

此外,从vista,您可以使用RAW Socket完成相同的工作(我认为更精确)。在vista之前,RAW Socket无法检索SEND数据包,这很可惜。

答案 1 :(得分:3)

http://connect.microsoft.com/WNDP/Downloads

检查WinSock LSP示例项目

您将在 nonifslsp \ sockinfo.cpp 中找到一个示例,其中“说明了如何开发能够计算通过TCP / IP套接字传输的所有字节的分层服务提供程序。” / EM>“

答案 2 :(得分:3)

我也想实现这个功能,所以我反转tcpview 3.0.2。

我发现,tcpview使用WMI性能计数器MSNT_TcpIpInformation。

但xp和2003官方不支持MSNT_TcpIpInformation。

这里是描述,你可以参考。 http://www.scriptinternals.com/new/us/support/Internal/WMI_MSNT_TcpIpInformation.htm

顺便提一下,MSNT_TcpIpInformation没有关于数据包的信息,所以tcpview只是每次都增加发送和revd数据包。 这是反汇编:

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

答案 3 :(得分:2)

netstat(netstatp)的sysinternals版本执行此操作。 IIRC,它使用SNMP收集其信息。搜索网络并找到您认为合适的版本。文件名是netstatp.c和netstatp.h Sysinternals不再发布我所知道的netstatp。

您也可以转到here并获取tcpview和/或tcpconv,其中一个以源格式提供。

答案 4 :(得分:1)

查看BitMeterOS的源代码,它适用于xp +。你们许多人也想看看TCPDump/Libpcap。这两个监控网络网络流量,libpcap可能会是你的后续虽然

还有Winpcap,更多面向Windows的“版本”,可以找到关于网络流量统计信息的简单教程here,您还会对this过滤感兴趣基于连接和this表示原始数据包的大小。

答案 5 :(得分:0)

我最好的选择是挂钩“发送”API电话并记录每次发送的金额。虽然这看起来真的不值得,但我很确定它会起作用。祝你好运!