头文件定义mytbf.h
#ifndef MYTBF_H__
#define MYTBF_H__
#define MYTBF_MAX 1024
typedef void mytbf_t;
mytbf_t *mytbf_init(int cps, int burst);
int mytbf_fetchtoken(mytbf_t *, int);
int mytbf_returntoken(mytbf_t *, int);
int mytbf_destroy(mytbf_t *);
#endif
令牌桶算法实现部分mytbf.c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include "mytbf.h"
typedef void (*sighandler_t)(int);
struct mytbf_st
{
int cps; // 每秒传输
int burst; // 最大限制
int token; // 积累传输量
int pos; // 记录当前令牌桶在令牌桶数组中的下标
};
struct mytbf_st *mytbf_arr[MYTBF_MAX];
static int inited = 0;
static sighandler_t alrm_handler_save;
static int get_pos(void)
{
for(int i = 0; i < MYTBF_MAX; i++)
{
if(mytbf_arr[i] == NULL)
return i;
}
return -1;
}
static void alrm_handler(int s)
{
alarm(1);
for(int i = 0; i < MYTBF_MAX; i++) {
if(mytbf_arr[i] != NULL)
{
mytbf_arr[i]->token += mytbf_arr[i]->cps;
if(mytbf_arr[i]->token > mytbf_arr[i]->burst)
mytbf_arr[i]->token = mytbf_arr[i]->burst;
}
}
}
static void module_unload(void)
{
signal(SIGALRM, alrm_handler_save);
alarm(0);
for(int i = 0; i < MYTBF_MAX; i++)
free(mytbf_arr[i]);
}
static void module_load(void)
{
alrm_handler_save = signal(SIGALRM, alrm_handler);
alarm

最低0.47元/天 解锁文章
1068

被折叠的 条评论
为什么被折叠?



