netstat如何知道接收和发送的字节数?

How does netstat know the number of bytes received and sent?

我想创建一个简单的应用程序来显示下载和上传的字节数。我注意到 netstat 就是这样做的(当使用 -e 开关时):

netstat 是如何知道这些信息的,它调用了 Windows API 函数还是什么?

Netstat 使用1 IP Helper API,它是核心Windows 网络API 的一部分。 运行 dumpbin /imports 在 netstat 上产生:(为简洁起见被剪掉)

IPHLPAPI.DLL
         140007000 Import Address Table
         1400080A0 Import Name Table
                 0 time date stamp
                 0 Index of first forwarder reference

                      A3 InternalGetBoundTcp6EndpointTable
                      A4 InternalGetBoundTcpEndpointTable
                      C2 InternalGetUdpTableWithOwnerModule
                      B5 InternalGetTcp6Table2
                      B9 InternalGetTcpTable2
                      B6 InternalGetTcp6TableWithOwnerModule
                      BB InternalGetTcpTableWithOwnerModule
                      BE InternalGetUdp6TableWithOwnerModule
                      80 GetUdpStatisticsEx
                      64 GetIpStatisticsEx
                      4D GetIcmpStatisticsEx
                      7A GetTcpStatisticsEx

最后 4 个 IP Helper 函数是您感兴趣的。GetUdpStatisticsEx, GetIpStatisticsEx, GetIcmpStatisticsEx and GetTcpStatisticsEx


1这是最有可能问题的答案,但为了完整起见,netstat 还导入了QueryPerformanceCounter 它可能用来产生输出。没有 netstat 的源代码,就无法 100% 确定。

每个接口发送和接收的八位字节数可以通过GetIfTable(). See dwInOctets and dwOutOctets from MIB_IFROW获得。