请教牛人:怎么测量某个端口或者某个运行中的进程的网络流量

请问牛人:如何测量某个端口或者某个运行中的进程的网络流量?
我用VC 2008编写一个小程序,我想测量本地主机某个进程或者某个端口对应的实时的网络流量(接收和发送的字节数及速度)。请问windows 提供这样的API吗?如果不提供,应该怎么办呢?

我的程序现在可以列出windows所有的运行的进程,以及所有打开的端口号。但是不知道如何才能统计出由这些进程或者端口产生的实时网络流量。

还请大牛不吝赐教,万分感谢!!!

------最佳解决方案--------------------
大三时写的pcap统计所有流量的程序,代码比较丑陋,凑合着看。

要统计某个端口,只需把过滤器pcap_filter设置为udp port 80 或者tcp port 80之类的就行了


#pragma once
#include "global.h"
#include "include/pcap.h"

class CNetStat
{
public:
CNetStat(const HWND hDlg);
~CNetStat(void);
//static HWND hWnd;
void Init(const USERDATA *pUserData);
HANDLE  m_hThread; //线程句柄
HANDLE  m_hThread1; //线程句柄

private:
HWND m_hDlg; //主界面句柄
const USERDATA* m_pData;
pcap_t* m_fp;
pcap_t* m_fp1;
friend void dispatcher_handler_send(u_char *state, const struct pcap_pkthdr *header, const u_char *pkt_data);
friend void dispatcher_handler_recv(u_char *state, const struct pcap_pkthdr *header, const u_char *pkt_data);
friend DWORD WINAPI WorkProc_SEND(LPVOID lpParam);
friend DWORD WINAPI WorkProc_RECV(LPVOID lpParam);



};






#include "StdAfx.h"
#include "NetStat.h"
#include "resource.h"

HWND hWnd;


CNetStat::CNetStat(const HWND hDlg) : m_hDlg(hDlg)
{
m_hThread=NULL;
m_hThread1=NULL;
m_fp=NULL;
m_fp1=NULL;

}

CNetStat::~CNetStat(void)
{
::CloseHandle(m_hThread);
::CloseHandle(m_hThread1);
}

DWORD WINAPI WorkProc_RECV(LPVOID lpParam)
{
CNetStat* pTalk=(CNetStat*)lpParam;
hWnd=pTalk->m_hDlg;
char errbuf[PCAP_ERRBUF_SIZE];
struct timeval st_ts;
u_int netmask;
struct bpf_program fcode;
char pcap_filter[100];
  
    /* 检查命令行参数的合法性 */

        
    /* 打开输出适配器 */
    if((pTalk->m_fp= pcap_open_live(pTalk->m_pData->nic,100,1,1000,errbuf))==NULL)
    {
        return 0;
    }

    /* 不用关心掩码,在这个过滤器中,它不会被使用 */
    netmask=0xffffff; 

sprintf_s(pcap_filter, "ether dst %x:%x:%x:%x:%x:%x",
      pTalk->m_pData->mac[0],pTalk->m_pData->mac[1],pTalk->m_pData->mac[2],
  pTalk->m_pData->mac[3],pTalk->m_pData->mac[4],pTalk->m_pData->mac[5]);
    // 编译过滤器
    if (pcap_compile(pTalk->m_fp, &fcode, pcap_filter, 1, netmask) <0 )
    {
        pcap_close(pTalk->m_fp);
return 0;
    }
    
    //设置过滤器
    if (pcap_setfilter(pTalk->m_fp, &fcode)<0)
    {
        pcap_close(pTalk->m_fp);
        /* 释放设备列表 */
        return 0;