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

Windows 如何计算每个TCP连接(系统范围)发送和接收的字节数?,windows,winapi,network-programming,Windows,Winapi,Network Programming,e、 g.TCPView的最新版本具有这样的功能:显示每个TCP连接发送/接收的字节数(启动TCPView时开始计数)。是否可以不进行数据包嗅探?windows是否为此提供任何API?我还没有找到这样的性能计数器 描述了如何枚举所有连接 编辑:TDI是否有助于接收每个套接字的传输统计信息?NetBIOS?任何要挖掘的链接?请查看以下位置的WinSock LSP示例项目: 您将在nonifslsp\sockinfo.cpp中找到一个示例,该示例“说明了如何开发一个能够计算通过TCP/IP套接字传输

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

描述了如何枚举所有连接


编辑:TDI是否有助于接收每个套接字的传输统计信息?NetBIOS?任何要挖掘的链接?

请查看以下位置的WinSock LSP示例项目:


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

我的最佳选择是挂接“发送”API调用并记录每次发送的数量。虽然这看起来真的不值得,但我确信它会奏效。祝你好运

netstat的sysinternals版本(netstatp)就是这样做的。IIRC,它使用SNMP收集其信息。搜索网络,找到一个你喜欢的版本。文件名为netstatp.c和netstatp.h
Sysinternals不再发布我所知道的netstatp


您还可以获取tcpview和/或tcpconv,其中一个是源代码形式的。

我也想实现此功能,因此我将tcpview 3.0.2反向

我发现,tcpview使用了WMI性能计数器MSNT\tcpip信息

但是MSNT\u TCPIP信息在xp和2003中不受官方支持

这是描述,你可以参考。

顺便说一下,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

看一下的源代码,它在xp+上工作。你们很多人也想看看。这两种方法都可以监控网络流量,但libpcap可能是您的目标


此外,还有一个更面向windows的“版本”,可以找到一个关于网络流量统计的简单教程,您还将对基于连接和原始数据包大小的过滤感兴趣。

总之,我基本上完全颠倒了tcpview 3.0.2,并根据我所学实现了与其相同的功能

tcpview用于监视网络活动

关键的API是OpenTrace和ProcessTrace

使用内核\记录器\名称并启用事件\跟踪\标志\网络\ TCPIP标志

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

在vista中,win提供了一些API来检索每个连接的统计信息。例如GetPertCPConnectionStats、GetPerudpConnectionStats,您可以从MSDN获得更多详细信息


另外,在vista中,您可以使用原始套接字完成相同的工作(我认为更精确)。在vista之前,原始套接字无法检索发送数据包,这很遗憾。

我最喜欢这个问题,我不会提供这个答案,但只是一个注释来指导,但你看了吗?@Anders:据我所知,这是系统范围的信息,不是每个TCP连接,对吧?似乎是这样。你还发现了什么吗?我在谷歌上搜索并发现了这个问题,因为TCPView没有显示64位Win7中发送/接收的字节。其他一些人也报告了这一点,但从未发布过解决方案。既然你们都深入到内部,你们知道为什么会发生这种情况吗?我找不到这个功能,你们能告诉我哪个版本是?+1吗。tnx的信息。我没有找到任何与中发送/接收的每连接字节相关的代码。tcpview在源代码中不可用,tcpconv不提供此类功能。有什么其他信息需要在SNMP中挖掘吗?@robin hood:对不起,我找不到sysinternals用来发布的旧代码。下次我去实体办公室时,我会看看它是否在那里。我知道你可以从SNMP获取信息,但我不知道OID。+1:tnx,有趣的信息,仍然在寻找更简单的
SetWindowsHookEx()
无法钩住
send()
啊,是的,我说得太快了,对不起。无论如何,也许您必须查看内核模式代码,因为所有send()都是在内核模式代码中结束的。。只是一个想法。不,你不需要在内核中弄脏你的手:你可以在Windows套接字中使用分层协议作为服务提供者来钩住
send()
,正如Maxim的回答所提到的。选中的BitMetereOS看起来像是它的系统范围统计数据,而不是每个套接字/连接。Winpcap:我记得它不会捕获环回流量。请更正me@AndyT:根据常见问题解答,它没有,但这是windows的问题:然而,使用winpcap的wireshark有一种方法来实现这一点:尽管我只会使用工作中的物理环路插头:Pinteresing。“在xp和2003中不受正式支持”。但它是受支持的,对吗?那么vista/w7呢?从vista中,windows提供了一些用于获取每个连接统计信息的API。例如GetPertCPConnectionStats、GetUdptCPConnectionStats,您可以从MSDN获得更多信息。@xjdrew:据我所知,没有
GetPerudpConnectionStats()
。另见: