gpt4 book ai didi

c - 如何在 Windows 7 上记录网络带宽?

转载 作者:太空宇宙 更新时间:2023-11-04 03:12:46 25 4
gpt4 key购买 nike

[在谷歌搜索和搜索数小时/数天后,我不敢相信这样的基本任务没有开箱即用的“hello world”。]

Windows 7 上,如何记录网络统计信息?如果可能,针对特定 IP 地址。这里的目标是在几个小时内记录 UDP/TCP 带宽和错误

已经尝试了很多软件,但都没有用。例如,NetMon 没有成功启动捕获,即使以管理员身份启动也是如此。

欢迎提供编程解决方案,尤其是使用 C/C++/C# 的解决方案。

最佳答案

MS 提供了一组 IP 辅助函数 ( https://learn.microsoft.com/en-us/windows/desktop/api/_iphlp/ ),允许管理和监控整个 IP 堆栈(本地 IP 协议(protocol)和派生 IP 协议(protocol))。

您可以使用专门针对 IPTCPUDP 的监控功能:

  • GetIpStatistics()
  • GetUdpStatistics()
  • GetTcpStatistics()

MS 在 https://learn.microsoft.com/en-us/windows/desktop/api/iphlpapi/nf-iphlpapi-getipstatistics 中提供功能样本,我报告:

#ifndef UNICODE
#define UNICODE
#endif

#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>

#pragma comment(lib, "iphlpapi.lib")

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))

/* Note: could also use malloc() and free() */

int main()
{

DWORD dwRetval;
MIB_IPSTATS *pStats;

pStats = (MIB_IPSTATS *) MALLOC(sizeof (MIB_IPSTATS));

if (pStats == NULL) {
wprintf(L"Unable to allocate memory for MIB_IPSTATS\n");
exit(1);
}
dwRetval = GetIpStatistics(pStats);
if (dwRetval != NO_ERROR) {
wprintf(L"GetIpStatistics call failed with %d\n", dwRetval);
exit(1);
} else {

wprintf(L"IP forwarding: \t\t" );
switch (pStats->dwForwarding) {
case MIB_IP_FORWARDING:
wprintf(L"Enabled\n");
break;
case MIB_IP_NOT_FORWARDING:
wprintf(L"Disabled\n");
break;
default:
wprintf(L"unknown value = %d\n", pStats->dwForwarding);
break;
}

wprintf(L"Default initial TTL: \t\t\t\t\t%u\n", pStats->dwDefaultTTL);

wprintf(L"Number of received datagrams: \t\t\t\t%u\n", pStats->dwInReceives);
wprintf(L"Number of received datagrams with header errors: \t%u\n", pStats->dwInHdrErrors);
wprintf(L"Number of received datagrams with address errors: \t%u\n", pStats->dwInAddrErrors);

wprintf(L"Number of datagrams forwarded: \t\t\t\t%ld\n", pStats->dwForwDatagrams);

wprintf(L"Number of received datagrams with an unknown protocol: \t%u\n", pStats->dwInUnknownProtos);
wprintf(L"Number of received datagrams discarded: \t\t%u\n", pStats->dwInDiscards);
wprintf(L"Number of received datagrams delivered: \t\t%u\n", pStats->dwInDelivers);

wprintf(L"Number of outgoing datagrams requested to transmit: \t%u\n", pStats->dwOutRequests);
wprintf(L"Number of outgoing datagrams discarded for routing: \t%u\n", pStats->dwRoutingDiscards);
wprintf(L"Number of outgoing datagrams discarded: \t\t%u\n", pStats->dwOutDiscards);
wprintf(L"Number of outgoing datagrams with no route to destination discarded: %u\n", pStats->dwOutNoRoutes);

wprintf(L"Fragment reassembly timeout: \t\t\t\t%u\n", pStats->dwReasmTimeout);
wprintf(L"Number of datagrams that required reassembly: \t\t%u\n", pStats->dwReasmReqds);
wprintf(L"Number of datagrams successfully reassembled: \t\t%u\n", pStats->dwReasmOks);
wprintf(L"Number of datagrams that could not be reassembled: \t%u\n", pStats->dwReasmFails);

wprintf(L"Number of datagrams fragmented successfully: \t\t%u\n", pStats->dwFragOks);
wprintf(L"Number of datagrams not fragmented and discarded: \t%u\n", pStats->dwFragFails);
wprintf(L"Number of fragments created: \t\t\t\t%u\n", pStats->dwFragCreates);

wprintf(L"Number of interfaces: \t\t\t\t\t%u\n", pStats->dwNumIf);
wprintf(L"Number of IP addresses: \t\t\t\t%u\n", pStats->dwNumAddr);
wprintf(L"Number of routes: \t\t\t\t\t%u\n", pStats->dwNumRoutes);
}

// Free memory allocated for the MIB_IPSTATS structure
if (pStats)
FREE(pStats);

return 0;
}

通过将辅助函数替换为适当的函数,可以将此代码重复用于与 IP、TCP 和 UDP 相关的每个函数。

对于那些允许将监控限制为 IPV4 或 IPV6 的功能,还存在扩展版本。

IP helper的MS页面有详细信息。

关于c - 如何在 Windows 7 上记录网络带宽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54762725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com