首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Windows 7上记录网络带宽?

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

Stack Overflow用户
提问于 2019-02-19 09:25:08
回答 2查看 143关注 0票数 1

在谷歌上搜索了几个小时/天之后,我不敢相信这样的基本任务竟然没有一个现成的“你好世界”。

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

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

欢迎编程解决方案,特别是使用C/C++/C#。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-22 09:51:22

MS提供了一组IP辅助函数(iphlp/),允许管理和监视整个IP堆栈(本地IP协议和派生的IP协议)。

您可以使用专门用于IPTCPUDP的监视功能。

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

MS在https://learn.microsoft.com/en-us/windows/desktop/api/iphlpapi/nf-iphlpapi-getipstatistics中提供了一个功能示例,我报告如下:

代码语言:javascript
复制
#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助手的MS页面上找到。

票数 1
EN

Stack Overflow用户

发布于 2019-02-20 09:13:00

下面是C#中的工作代码:

代码语言:javascript
复制
using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Text;

namespace App1
{
class Wrap
{
    public static void ShowUdpStatistics(NetworkInterfaceComponent version)
    {
        IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
        UdpStatistics udpStat = null;

        switch (version)
        {
            case NetworkInterfaceComponent.IPv4:
                udpStat = properties.GetUdpIPv4Statistics();
                Console.WriteLine("UDP IPv4 Statistics");
                break;
            case NetworkInterfaceComponent.IPv6:
                udpStat = properties.GetUdpIPv6Statistics();
                Console.WriteLine("UDP IPv6 Statistics");
                break;
            default:
                throw new ArgumentException("version");
                //    break;
        }
        Console.WriteLine("  Datagrams Received ...................... : {0}",
            udpStat.DatagramsReceived);
        Console.WriteLine("  Datagrams Sent .......................... : {0}",
            udpStat.DatagramsSent);
        Console.WriteLine("  Incoming Datagrams Discarded ............ : {0}",
            udpStat.IncomingDatagramsDiscarded);
        Console.WriteLine("  Incoming Datagrams With Errors .......... : {0}",
            udpStat.IncomingDatagramsWithErrors);
        Console.WriteLine("  UDP Listeners ........................... : {0}",
            udpStat.UdpListeners);
        Console.WriteLine("");
    }

    /*public static void SendUdp()
    {
        Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);

        IPAddress serverAddr = IPAddress.Parse("192.168.2.255");

        IPEndPoint endPoint = new IPEndPoint(serverAddr, 11050);

        string text = "Hello";
        byte[] send_buffer = Encoding.ASCII.GetBytes(text);

        sock.SendTo(send_buffer, endPoint);
    }*/

}

class Program
{
    static void Main(string[] args)
    {
        for (int i=0; i < 10; i++)
        {
            Wrap.ShowUdpStatistics(NetworkInterfaceComponent.IPv4);
            /*Wrap.SendUdp();*/
        }
    }
}
}

这是一个增强的(而且是开箱即用!)MSDN文档中示例的版本。

此处添加了注释代码,以验证计数器在发送UDP数据包时是否会增长。感谢这个问题的第一个答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54762725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档