有流量时才计时的网络计时器

 下面是基于ace定时器写的网络流量计算代码。你只需要把里面的时间间隔设为你需要的,比如1秒。然后定义一个时间变量,只在每次有流量的时候进行累加,就是网络速度不为0的时候。不过这个是算电脑上网卡流量的~还需要ace的库才可以跑~代码如下:

用这个要先配置好ace,其实不用ace的话直接在个while里面sleep几秒再用handle_timeout也是可以的

#include "ace/Reactor.h"
#include <windows.h>

#include "Iphlpapi.h"
#include "iprtrmib.h"

#include <iostream> //清屏

#include "ace/Event_Handler.h"
#include "ace/Timer_Heap_T.h"
#include "ace/Timer_Queue_Adapters.h"

typedef ACE_Event_Handler_Handle_Timeout_Upcall<ACE_Null_Mutex> Upcall;
typedef ACE_Timer_Heap_T<ACE_Event_Handler *,Upcall,ACE_Null_Mutex> Timer_Heap;
//typedef ACE_Timer_Heap_Iterator_T<ACE_Event_Handler *,Upcall,ACE_Null_Mutex> Timer_Heap_Iterator;
typedef ACE_Thread_Timer_Queue_Adapter<Timer_Heap> Thread_Timer_Queue;


//DWORD index;
class CTimerHandler : public ACE_Event_Handler
{
public:
DWORD dwLastOut;
DWORD dwLastIn;
DWORD dwLastTime;
virtual int handle_timeout(const ACE_Time_Value &tv, const void *arg = 0)
{
//SYSTEMTIME time;
//GetLocalTime(&time);
//printf("%d:%d:%d/ninput 0 to end/n", time.wHour, time.wMinute, time.wSecond);
//Sleep(3000);printf("qwe/n");

MIB_IFROW mi;
mi.dwIndex = 2;//2
GetIfEntry(&mi);
DWORD thisUp = mi.dwOutOctets;

system("cls");//清屏

DWORD dwthisTime = GetTickCount();
DWORD dwPastTime = dwthisTime - dwLastTime;
dwLastTime = dwthisTime;
dwPastTime /= 1000;//毫秒转换为秒
dwPastTime = (dwPastTime > 1) ? dwPastTime : 1; //不足1秒取1秒
if (mi.dwInOctets - dwLastIn > 1024)
{
printf("发送: %dK/s 接收%dK/s/n", (mi.dwOutOctets - dwLastOut)/ 1024 / dwPastTime, (mi.dwInOctets - dwLastIn)/ 1024 / dwPastTime);
}
else
printf("发送: %dB/s 接收%dB/s/n", (mi.dwOutOctets - dwLastOut) / dwPastTime, (mi.dwInOctets - dwLastIn) / dwPastTime);
printf("带宽%db/s/n", mi.dwSpeed);
dwLastOut = mi.dwOutOctets;
dwLastIn = mi.dwInOctets;
printf("发送: %dBytes 接收%dBytes/n", dwLastOut, dwLastIn);

return 0;
}

};

int ACE_TMAIN(int, ACE_TCHAR *[])
{
char tempChar;
ULONG uListSize=1;
PIP_ADAPTER_INFO pAdapter; // 定义PIP_ADAPTER_INFO结构存储网卡信息
int nAdapterIndex = 0;
DWORD dwRet = GetAdaptersInfo((PIP_ADAPTER_INFO)&tempChar, &uListSize); // 关键函数
if (dwRet == ERROR_BUFFER_OVERFLOW)
{
PIP_ADAPTER_INFO pAdapterListBuffer = (PIP_ADAPTER_INFO)new(char[uListSize]);
DWORD dwRet = GetAdaptersInfo(pAdapterListBuffer, &uListSize);
if (dwRet == ERROR_SUCCESS)
{
pAdapter = pAdapterListBuffer;
while (pAdapter) // 枚举网卡
{
/*string strTemp;*/
printf("网卡的名字:%s/n",pAdapter->AdapterName);// 网卡名字
printf("网卡的index:%d/n",pAdapter->Index);// 编号
// strTemp = CString("//Device//NPF_") + strTemp;??? // 加上前缀
// strcpy(AdapterList[nAdapterIndex].szDeviceName,strTemp);
// strcpy(AdapterList[nAdapterIndex].szIPAddrStr, pAdapter->IpAddressList.IpAddress.String );// IP
// FormatMACToStr( AdapterList[nAdapterIndex].szHWAddrStr,pAdapter->Address ); // MAC
// AdapterList[nAdapterIndex].filled = true;
pAdapter = pAdapter->Next;
nAdapterIndex ++;
}
delete pAdapterListBuffer;
}
}

//ULONG ListSize = (ULONG)sizeof(PIP_ADAPTER_INFO);
//PIP_ADAPTER_INFO *pAdapterListBuffer = new PIP_ADAPTER_INFO;

//GetAdaptersInfo(pAdapterListBuffer, &uListSize);
//printf("%d",pAdapterListBuffer->Index);
//delete pAdapterListBuffer;


CTimerHandler * pTH = new CTimerHandler();

//ACE_Reactor reactor;
//int id = ACE_Reactor::instance()->schedule_timer(pTH, NULL, ACE_Time_Value(0), ACE_Time_Value(5));
ACE_Reactor::instance()->run_reactor_event_loop();
//while (1)
//{
// ACE_Reactor::instance()->handle_events();
// printf("..../n");
//}
//LPWSTR name = L"";
//GetAdapterIndex(
// name,
// &index
// );

Thread_Timer_Queue timer;
timer.schedule(pTH, NULL, ACE_Time_Value(1) + ACE_OS::gettimeofday(), ACE_Time_Value(1));
timer.activate();

int stop;
printf("input 0 to end/n");
scanf_s("%d",&stop);
if (0 == stop)
{
//ACE_Reactor::instance()->cancel_Timer(id);
timer.deactivate();
timer.wait();
}

//int i = -7;
//i = 0xEFFFFFFF & i;
i = i>>1;
//printf("%o/n",i);
scanf_s("%d",&stop);

return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
滑动窗口流量控制是一种常见的网络流量控制方法,它通过限制发送方在一定时间内发送的数据量来控制网络流量。其基本原理是在发送方和接收方之间设置一个固定大小的窗口,发送方只能发送窗口内的数据,接收方只能接收窗口内的数据。随着数据的传输,发送方会不断地向接收方发送确认信息,接收方根据确认信息来调整窗口的大小,从而实现流量控制。 具体来说,滑动窗口流量控制的实现过程如下: 1. 发送方将要发送的数据分成固定大小的数据块,并将这些数据块按顺序放入发送缓冲区中。 2. 发送方维护一个发送窗口,窗口大小为固定值。发送方只能发送窗口内的数据块。 3. 发送方向接收方发送窗口内的数据块,并启动一个计时器。如果在计时器超时之前没有收到接收方的确认信息,则认为这些数据块丢失,需要重新发送。 4. 接收方接收到数据块后,向发送方发送确认信息,并将这些数据块放入接收缓冲区中。 5. 接收方维护一个接收窗口,窗口大小为固定值。接收方只能接收窗口内的数据块。 6. 接收方根据确认信息来调整接收窗口的大小。如果接收方收到的数据块已经超出了接收窗口的范围,则需要丢弃这些数据块。 7. 发送方根据接收方发送的确认信息来调整发送窗口的大小。如果发送方收到的确认信息表示有数据块已经被接收方成功接收,则可以将发送窗口向前滑动,继续发送新的数据块。 通过滑动窗口流量控制,可以有效地控制网络流量,避免网络拥塞和数据丢失。同时,滑动窗口流量控制也可以提高网络传输的效率,减少网络延迟和传输时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值