关于GetPerTcpConnectionEStats()的一些问题,它不能正常工作 [英] Some question aboout GetPerTcpConnectionEStats(),it dose not work correctly

查看:191
本文介绍了关于GetPerTcpConnectionEStats()的一些问题,它不能正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我正在使用Microsoft Visual Studio 2010,操作系统是Win7.我要我们 GetPerTcpConnectionEStats()来获取计算机的净流量. GetPerTcpConnectionEStats()函数在Windows Vista及更高版本上定义.当我使用此API时,每个网络连接的网络流量都相同.

Hi,I am working with Microsoft Visual studio 2010,OS is Win7.I want to us GetPerTcpConnectionEStats() to get my computer's net flow.The GetPerTcpConnectionEStats() function is defined on Windows Vista and later. When I use this API,each net connection's net flow are all the same.

以下是一些示例结果:

TCP [86]本地端口:46661
TCP [86]远程地址:125.39.127.34
TCP [86]远程端口:80
数据
字节输出:3995512
字节数:7733362

TCP[86] Local Port: 46661
TCP[86] Remote Addr: 125.39.127.34
TCP[86] Remote Port: 80
Data
Bytes Out: 3995512
Bytes In : 7733362

TCP [87]状态:5-已建立
TCP [87]本地地址:115.155.37.45
TCP [87]本地端口:46662
TCP [87]远程地址:125.39.127.37
TCP [87]远程端口:80
数据
字节输出:3995512
字节数:7733362

TCP[87] State: 5 - ESTABLISHED
TCP[87] Local Addr: 115.155.37.45
TCP[87] Local Port: 46662
TCP[87] Remote Addr: 125.39.127.37
TCP[87] Remote Port: 80
Data
Bytes Out: 3995512
Bytes In : 7733362

TCP [88]状态:5-已建立
TCP [88]本地地址:115.155.37.45
TCP [88]本地端口:46663
TCP [88]远程地址:125.39.127.37
TCP [88]远程端口:80
数据
字节输出:3995512
字节数:7733362

TCP[88] State: 5 - ESTABLISHED
TCP[88] Local Addr: 115.155.37.45
TCP[88] Local Port: 46663
TCP[88] Remote Addr: 125.39.127.37
TCP[88] Remote Port: 80
Data
Bytes Out: 3995512
Bytes In : 7733362

这是我的代码,谢谢!

#include"stdafx.h"
#include< winsock2.h>
#include< Windows.h>
#include< ws2tcpip.h>
#include< iphlpapi.h>
#include< tcpestats.h>
#include< stdlib.h>
#include< stdio.h>

#include "stdafx.h"
#include <winsock2.h>
#include <Windows.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <tcpestats.h>
#include <stdlib.h>
#include <stdio.h>

#pragma注释(lib,"iphlpapi.lib")
#pragma comment(lib," ws2_32.lib")

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

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

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

/*注意:也可以使用malloc()和free()*/

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


int _tmain(int argc,_TCHAR * argv [])
{
 //声明并初始化变量
  PMIB_TCPTABLE pTcpTable;
  PMIB_TCPROW行;
  DWORD dwSize = 0;
  DWORD dwRetVal = 0;


int _tmain(int argc, _TCHAR* argv[])
{
 // Declare and initialize variables
 PMIB_TCPTABLE pTcpTable;
 PMIB_TCPROW row;
 DWORD dwSize = 0;
 DWORD dwRetVal = 0;

  char szLocalAddr [128];
  char szRemoteAddr [128];

 char szLocalAddr[128];
 char szRemoteAddr[128];

ULONG rosSize = 0,rodSize = 0;
  ULONG winStatus;
  PUCHAR ros = NULL,rod = NULL;

 ULONG rosSize=0,rodSize=0;
 ULONG winStatus;
 PUCHAR ros=NULL,rod=NULL;

  PTCP_ESTATS_DATA_ROD_v0 dataRod = {0};

 PTCP_ESTATS_DATA_ROD_v0 dataRod = {0};

  struct in_addr IpAddr;

 struct in_addr IpAddr;

  int i;

 int i;

  pTcpTable =(MIB_TCPTABLE *)MALLOC(sizeof(MIB_TCPTABLE));
  if(pTcpTable == NULL){
   printf("分配内存错误\ n");
  返回1;
 }

 pTcpTable = (MIB_TCPTABLE *) MALLOC(sizeof (MIB_TCPTABLE));
 if (pTcpTable == NULL) {
  printf("Error allocating memory\n");
  return 1;
 }

&dbSize = sizeof(MIB_TCPTABLE);
  rodSize = sizeof(TCP_ESTATS_DATA_ROD_v0);

 dwSize = sizeof (MIB_TCPTABLE);
 rodSize=sizeof(TCP_ESTATS_DATA_ROD_v0);

 //对GetTcpTable进行初始调用,以
 //将所需的大小放入dwSize变量中
  if(((dwRetVal = GetExtendedTcpTable(pTcpTable,& dwSize,TRUE,AF_INET,TCP_TABLE_BASIC_ALL,0))==
   ERROR_INSUFFICIENT_BUFFER){
   免费(pTcpTable);
   pTcpTable =(MIB_TCPTABLE *)MALLOC(dwSize);
    if(pTcpTable == NULL){
    printf(分配内存时出错\ n");
   返回1;
   }
 }
 //再次调用GetTcpTable以获取
 //我们需要的实际数据
  if(((dwRetVal = GetExtendedTcpTable(pTcpTable,& dwSize,TRUE,AF_INET,TCP_TABLE_BASIC_ALL,0))== NO_ERROR){
   row = pTcpTable-> table;
   printf("\ t条目数:%d \ n",(int)pTcpTable-> dwNumEntries);
  对于(i = 0; i<(int)pTcpTable-> dwNumEntries; i ++){
   printf("\ n \ tTCP [%d]状态:%ld-",i,
    pTcpTable-> table [i] .dwState);
   开关(pTcpTable-> table [i] .dwState){
  案例MIB_TCP_STATE_CLOSED:
    printf("CLOSED \ n");
    break;
  案例MIB_TCP_STATE_LISTEN:
    printf("LISTEN \ n");
    break;
  案例MIB_TCP_STATE_SYN_SENT:
    printf("SYN-SENT \ n");
    break;
  情况为MIB_TCP_STATE_SYN_RCVD:
    printf("SYN-RECEIVED \ n");
    break;
  案例MIB_TCP_STATE_ESTAB:
    printf("ESTABLISHED \ n");
    break;
  案例MIB_TCP_STATE_FIN_WAIT1:
    printf("FIN-WAIT-1 \ n");
    break;
  案例MIB_TCP_STATE_FIN_WAIT2:
    printf("FIN-WAIT-2 \ n");
    break;
  案例MIB_TCP_STATE_CLOSE_WAIT:
    printf("CLOSE-WAIT \ n");
    break;
  案例MIB_TCP_STATE_CLOSING:
    printf("CLOSING \ n");
    break;
  案例MIB_TCP_STATE_LAST_ACK:
    printf("LAST-ACK \ n");
    break;
  案例MIB_TCP_STATE_TIME_WAIT:
    printf("TIME-WAIT \ n");
    break;
  案例MIB_TCP_STATE_DELETE_TCB:
    printf("DELETE-TCB \ n");
    break;
   默认值:
    printf("UNKNOWN dwState value \ n");
    break;
   }

 // Make an initial call to GetTcpTable to
 // get the necessary size into the dwSize variable
 if ((dwRetVal = GetExtendedTcpTable(pTcpTable, &dwSize,TRUE,AF_INET,TCP_TABLE_BASIC_ALL,0)) ==
  ERROR_INSUFFICIENT_BUFFER) {
   FREE(pTcpTable);
   pTcpTable = (MIB_TCPTABLE *) MALLOC(dwSize);
   if (pTcpTable == NULL) {
    printf("Error allocating memory\n");
    return 1;
   }
 }
 // Make a second call to GetTcpTable to get
 // the actual data we require
 if ((dwRetVal = GetExtendedTcpTable(pTcpTable, &dwSize,TRUE,AF_INET,TCP_TABLE_BASIC_ALL,0)) == NO_ERROR) {
  row=pTcpTable->table;
  printf("\tNumber of entries: %d\n", (int) pTcpTable->dwNumEntries);
  for (i = 0; i < (int) pTcpTable->dwNumEntries; i++) {
   printf("\n\tTCP[%d] State: %ld - ", i,
    pTcpTable->table[i].dwState);
   switch (pTcpTable->table[i].dwState) {
   case MIB_TCP_STATE_CLOSED:
    printf("CLOSED\n");
    break;
   case MIB_TCP_STATE_LISTEN:
    printf("LISTEN\n");
    break;
   case MIB_TCP_STATE_SYN_SENT:
    printf("SYN-SENT\n");
    break;
   case MIB_TCP_STATE_SYN_RCVD:
    printf("SYN-RECEIVED\n");
    break;
   case MIB_TCP_STATE_ESTAB:
    printf("ESTABLISHED\n");
    break;
   case MIB_TCP_STATE_FIN_WAIT1:
    printf("FIN-WAIT-1\n");
    break;
   case MIB_TCP_STATE_FIN_WAIT2:
    printf("FIN-WAIT-2 \n");
    break;
   case MIB_TCP_STATE_CLOSE_WAIT:
    printf("CLOSE-WAIT\n");
    break;
   case MIB_TCP_STATE_CLOSING:
    printf("CLOSING\n");
    break;
   case MIB_TCP_STATE_LAST_ACK:
    printf("LAST-ACK\n");
    break;
   case MIB_TCP_STATE_TIME_WAIT:
    printf("TIME-WAIT\n");
    break;
   case MIB_TCP_STATE_DELETE_TCB:
    printf("DELETE-TCB\n");
    break;
   default:
    printf("UNKNOWN dwState value\n");
    break;
   }

   IpAddr.S_un.S_addr =(u_long)pTcpTable-> table [i] .dwLocalAddr;
    strcpy_s(szLocalAddr,sizeof(szLocalAddr),inet_ntoa(IpAddr));
   printf("\ tTCP [%d] Local Addr:%s \ n",i,szLocalAddr);
   printf("\ tTCP [%d]本地端口:%d \ n",i,
    ntohs((u_short)pTcpTable-> table [i] .dwLocalPort));

   IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwLocalAddr;
   strcpy_s(szLocalAddr, sizeof (szLocalAddr), inet_ntoa(IpAddr));
   printf("\tTCP[%d] Local Addr: %s\n", i, szLocalAddr);
   printf("\tTCP[%d] Local Port: %d \n", i,
    ntohs((u_short)pTcpTable->table[i].dwLocalPort));

   IpAddr.S_un.S_addr =(u_long)pTcpTable-> table [i] .dwRemoteAddr;
   strcpy_s(szRemoteAddr,sizeof(szRemoteAddr),inet_ntoa(IpAddr));
   printf("\ tTCP [%d]远程地址:%s \ n",i,szRemoteAddr);
   printf("\ tTCP [%d]远程端口:%d \ n",i,
    ntohs(((u_short)pTcpTable-> table [i] .dwRemotePort));
   
    if(rodSize!= 0){
    rod =(PUCHAR)malloc(rodSize);
    if(rod == NULL){
     printf(内存不足");
   }
   }

   IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwRemoteAddr;
   strcpy_s(szRemoteAddr, sizeof (szRemoteAddr), inet_ntoa(IpAddr));
   printf("\tTCP[%d] Remote Addr: %s\n", i, szRemoteAddr);
   printf("\tTCP[%d] Remote Port: %d\n", i,
    ntohs((u_short)pTcpTable->table[i].dwRemotePort));
   
   if(rodSize!=0){
    rod=(PUCHAR)malloc(rodSize);
    if(rod==NULL){
     printf("Out of Memory");
    }
   }

   winStatus = GetPerTcpConnectionEStats(row,TcpConnectionEstatsData,NULL,0,0,NULL,0,0,rod,0,rodSize);

   winStatus = GetPerTcpConnectionEStats(row,TcpConnectionEstatsData,NULL,0,0,NULL,0,0,rod,0,rodSize);

   if(winStatus == NO_ERROR)
    {
    dataRod =(PTCP_ESTATS_DATA_ROD_v0)杆;
    printf("\ tData \ n");
    printf("\ tBytes Out:%lu \ n",dataRod-> DataBytesOut);
    printf("\ tBytes In:%lu \ n",dataRod-> DataBytesIn);
   }
    ++ row;
  }
 }其他{
   printf("\ tGetTcpTable失败,出现%d \ n",dwRetVal);
  免费(pTcpTable);
  返回1;
 }

   if(winStatus==NO_ERROR)
   {
    dataRod = (PTCP_ESTATS_DATA_ROD_v0) rod;
    printf("\tData\n");
    printf("\tBytes Out: %lu\n",dataRod->DataBytesOut);
    printf("\tBytes In : %lu\n",dataRod->DataBytesIn);
   }
   ++row;
  }
 } else {
  printf("\tGetTcpTable failed with %d\n", dwRetVal);
  FREE(pTcpTable);
  return 1;
 }

  if(pTcpTable!= NULL){
  免费(pTcpTable);
   pTcpTable = NULL;
 }

 if (pTcpTable != NULL) {
  FREE(pTcpTable);
  pTcpTable = NULL;
 }

  system("PAUSE");
 返回0;
}

 system("PAUSE");
 return 0;
}

推荐答案

如果您没有正确的权限,则必须具有管理员权限才能使用此功能Extension TCP Stat返回一个随机数,并且您必须将SetPertTcpConnection设置为true才能启用从扩展TCP收集统计信息

You must have administrator rights to be able to use this Function if you have not right Extention TCP Stat return a rondom number and also you must set SetPertTcpConnection as true to enable collecting statistics from Extention TCP

// GetPerTcpConnectionEStats.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <winsock2.h>
#include <Windows.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <tcpestats.h>
#include <stdlib.h>
#include <stdio.h>
 
#pragma comment(lib"iphlpapi.lib")
#pragma comment(lib"ws2_32.lib")
 
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
 
/* Note: could also use malloc() and free() */
 
 
int _tmain(int argc, _TCHAR* argv[])
{
	// Declare and initialize variables
	PMIB_TCPTABLE pTcpTable;
	PMIB_TCPROW row;
	DWORD dwSize = 0;
	DWORD dwRetVal = 0;
 
	char szLocalAddr[128];
	char szRemoteAddr[128];
 
	ULONG rosSize=0,rodSize=0;
	ULONG winStatus;
	PUCHAR ros=NULL,rod=NULL;
 
	PTCP_ESTATS_BANDWIDTH_ROD_v0 BANDWIDTHRod = {0};
 
	struct in_addr IpAddr;
 
	int i;
 
	pTcpTable = (MIB_TCPTABLE *) MALLOC(sizeof (MIB_TCPTABLE));
	if (pTcpTable == NULL) {
		printf("Error allocating memory\n");
		return 1;
	}
 
	dwSize = sizeof (MIB_TCPTABLE);
	rodSize=sizeof(TCP_ESTATS_BANDWIDTH_ROD_v0);
 
	// Make an initial call to GetTcpTable to
	// get the necessary size into the dwSize variable
	if ((dwRetVal = GetExtendedTcpTable(pTcpTable, &dwSize,TRUE,AF_INET,TCP_TABLE_BASIC_ALL,0)) ==
		ERROR_INSUFFICIENT_BUFFER) {
			FREE(pTcpTable);
			pTcpTable = (MIB_TCPTABLE *) MALLOC(dwSize);
			if (pTcpTable == NULL) {
				printf("Error allocating memory\n");
				return 1;
			}
	}
	// Make a second call to GetTcpTable to get
	// the actual BANDWIDTH we require
	if ((dwRetVal = GetExtendedTcpTable(pTcpTable, &dwSize,TRUE,AF_INET,TCP_TABLE_BASIC_ALL,0)) == NO_ERROR) {
		row=pTcpTable->table;
		
		printf("\tNumber of entries: %d\n", (int) pTcpTable->dwNumEntries);
	
		for (i = 0; i < (int) pTcpTable->dwNumEntries; i++) {
			printf("\n\tTCP[%d] State: %ld - ", i,
				pTcpTable->table[i].dwState);
			
			switch (pTcpTable->table[i].dwState) {
			case MIB_TCP_STATE_CLOSED:
				printf("CLOSED\n");
				break;
			case MIB_TCP_STATE_LISTEN:
				printf("LISTEN\n");
				break;
			case MIB_TCP_STATE_SYN_SENT:
				printf("SYN-SENT\n");
				break;
			case MIB_TCP_STATE_SYN_RCVD:
				printf("SYN-RECEIVED\n");
				break;
			case MIB_TCP_STATE_ESTAB:
				printf("ESTABLISHED\n");
				break;
			case MIB_TCP_STATE_FIN_WAIT1:
				printf("FIN-WAIT-1\n");
				break;
			case MIB_TCP_STATE_FIN_WAIT2:
				printf("FIN-WAIT-2 \n");
				break;
			case MIB_TCP_STATE_CLOSE_WAIT:
				printf("CLOSE-WAIT\n");
				break;
			case MIB_TCP_STATE_CLOSING:
				printf("CLOSING\n");
				break;
			case MIB_TCP_STATE_LAST_ACK:
				printf("LAST-ACK\n");
				break;
			case MIB_TCP_STATE_TIME_WAIT:
				printf("TIME-WAIT\n");
				break;
			case MIB_TCP_STATE_DELETE_TCB:
				printf("DELETE-TCB\n");
				break;
			default:
				printf("UNKNOWN dwState value\n");
				break;
			}
 
			IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwLocalAddr;
			strcpy_s(szLocalAddr, sizeof (szLocalAddr), inet_ntoa(IpAddr));
			printf("\tTCP[%d] Local Addr: %s\n", i, szLocalAddr);
			printf("\tTCP[%d] Local Port: %d \n", i,
				ntohs((u_short)pTcpTable->table[i].dwLocalPort));
 
			IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwRemoteAddr;
			strcpy_s(szRemoteAddr, sizeof (szRemoteAddr), inet_ntoa(IpAddr));
			printf("\tTCP[%d] Remote Addr: %s\n", i, szRemoteAddr);
			printf("\tTCP[%d] Remote Port: %d\n", i,
				ntohs((u_short)pTcpTable->table[i].dwRemotePort));
 
			if(rodSize!=0){
				rod=(PUCHAR)malloc(rodSize);
				if(rod==NULL){
					printf("Out of Memory");
				}
			}
 
			ULONG status, size = 0;
			PUCHAR rw = NULL;
			TCP_ESTATS_BANDWIDTH_RW_v0 fineRttRw;
 
 
			fineRttRw.EnableCollectionInbound =TcpBoolOptEnabled ;
			fineRttRw.EnableCollectionOutbound =TcpBoolOptEnabled ;
			rw = (PUCHAR) & fineRttRw;
			size = sizeof (TCP_ESTATS_BANDWIDTH_RW_v0);
 
			status = SetPerTcpConnectionEStats((PMIB_TCPROW) row, TcpConnectionEstatsBandwidth, rw, 0, size, 0);
 
			if(status == NO_ERROR)
			{
				winStatus = GetPerTcpConnectionEStats(row,TcpConnectionEstatsBandwidth,NULL,0,0,NULL,0,0,rod,0,rodSize);
 
			if(winStatus==NO_ERROR)
			{
				BANDWIDTHRod = (PTCP_ESTATS_BANDWIDTH_ROD_v0) rod;
				printf("\tBANDWIDTH\n");
				printf("\tBytes Out: %lu ko\n",BANDWIDTHRod->OutboundBandwidthPeaked/1024) ;
				printf("\tBytes In : %lu ko\n",BANDWIDTHRod->InboundBandwidthPeaked/1024);
			}
			}
			++row; 
		}
	} else {
		printf("\tGetTcpTable failed with %d\n", dwRetVal);
		FREE(pTcpTable);
		return 1;
	}
 
	if (pTcpTable != NULL) {
		FREE(pTcpTable);
		pTcpTable = NULL;
	}
 
	system("PAUSE");
	return 0;
}
 
 

 


这篇关于关于GetPerTcpConnectionEStats()的一些问题,它不能正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆