내 응용 프로그램 전송 속도를 900kbps로 제한하려하지만 사용하는 프로토콜이 메시지 지향이며 메시지 크기가 매우 다릅니다. 나는 40 바이트에서 최대 125000 바이트까지 메시지를 가질 수 있으며 모든 메시지는 원자 단위로 보내집니다.메시지 용 토큰 양동이 또는 새는 물통
토큰 버킷 버퍼를 구현하려고 시도했지만 낮은 버킷 크기를 설정하면 큰 패킷이 전송되지 않고 더 큰 버킷이 속도 제한이없는 큰 버스트가됩니다.
이 C에서 나의 작은 구현 : 그런 곳에서
typedef struct token_buffer {
size_t capacity;
size_t tokens;
double rate;
uint64_t timestamp;
} token_buffer;
static uint64_t time_now()
{
struct timeval ts;
gettimeofday(&ts, NULL);
return (uint64_t)(ts.tv_sec * 1000 + ts.tv_usec/1000);
}
static int token_buffer_init(token_buffer *tbf, size_t max_burst, double rate)
{
tbf->capacity = max_burst;
tbf->tokens = max_burst;
tbf->rate = rate;
tbf->timestamp = time_now();
}
static size_t token_buffer_consume(token_buffer *tbf, size_t bytes)
{
// Update the tokens
uint64_t now = time_now();
size_t delta = (size_t)(tbf->rate * (now - tbf->timestamp));
tbf->tokens = (tbf->capacity < tbf->tokens+delta)?tbf->capacity:tbf->tokens+delta;
tbf->timestamp = now;
fprintf(stdout, "TOKENS %d bytes: %d\n", tbf->tokens, bytes);
if(bytes <= tbf->tokens) {
tbf->tokens -= bytes;
} else {
return -1;
}
return 0;
}
) (주 : 당신은 tbf-에 할당됩니다있는 (max_burst하여 최대 메시지 크기를 제한하고
while(1) {
len = read_msg(&msg, file);
// Loop until we have enough tokens.
// if len is larger than the bucket capacity the loop never ends.
// if the capacity is too large then no rate limit occurs.
while(token_buffer_consume(&tbf,msg, len) != 0) {}
send_to_net(&msg, len);
}