限速linux c语言,基于Linux系统的流量控制程序的C语言代码

基于Linux系统的流量控制程序的C语言代码

基于Linux系统的流量控制程序的C语言代码

mytbf.h头文件

ifndef MYTBF_H_

#define MYTBF_H_

typedef void mytbf_t;

mytbf_t *tbf_init(int bits,int max);

int gettoken(mytbf_t *tbf,int tknum);

int returntoken(mytbf_t *tbf,int rtnum);

int tbffree(mytbf_t *tbf);

#endif

mytbf.c文件

#include

#include

#include

#include

struct tbf_t

{

int bits;

int token;

int maxtoken;

};

struct tbf_t *data=NULL;

int initflag=1;

void sigdo(int s)

{

data->token=data->token+data->bits;

if(data->token>=data->maxtoken)

data->token=data->token;

alarm(1);

}

mytbf_t *tbf_init(int bits,int max)

{

data=malloc(sizeof(*data));

if(bits < 0)

return NULL;

if(bits > max)

return NULL;

data->bits=bits;

data->token=bits;

data->maxtoken=max;

if(initflag)

{

signal(SIGALRM,sigdo);

alarm(1);

initflag=0;

}

return data;

}

int gettoken(mytbf_t *tbf,int tknum)

{

int min;

data=(struct tbf_t *)tbf;

if(tknum < 0)

return -1;

if(tknum > data->maxtoken)

return -2;

while(data->token == 0)

pause();

min=data->token > tknum ? tknum:data->token;

data->token=data->token-min;

return min;

}

int returntoken(mytbf_t *tbf,int rtnum)

{

data=(struct tbf_t *)tbf;

if(rtnum < 0)

return -3;

if(data->token > data->maxtoken-rtnum)

data->token=data->maxtoken;

else

data->token=data->token+rtnum;

return 0;

}

int tbffree(mytbf_t *tbf)

{

free(tbf);

return 0;

}

mycat.c文件:实现Linux终端命令cat的功能,显示文件内容,不过为这个程序加上了流量控制。

#include

#include

#include

#include

#include

#include

#include

#include

#define SIZE 20

#define MAXSIZE 500

static int fd;

void func_closefile()

{

close(fd);

}

int main(int argc,char **argv)

{

char buff[SIZE];

int res;

int res1;

int retnum;

mytbf_t *tbf;

if(argc<2)

{

fprintf(stdout,"出错,命令后没有文件名!\n");

exit(-1);

}

do{

fd=open(argv[1],O_RDONLY);

if(fd < 0)

{

if(errno == EINTR)

continue;

perror("open()");

exit(-2);

}

}while(fd < 0);

atexit(func_closefile);

tbf = tbf_init(SIZE,MAXSIZE);

while(1)

{

retnum=gettoken(tbf,MAXSIZE);

res = read(fd,buff,retnum);

if(retnum-res > 0)

{

returntoken(tbf,retnum-res);

}

if(res==0)

break;

if(res<0)

{

if(errno == EINTR)

continue;

perror("read()");

exit(-3);

}

do{

res1 = write(1,buff,res);

if(res1 < 0)

{

if(errno == EINTR)

continue;

perror("write()");

exit(-4);

}

}while(res1<0);

}

tbffree(tbf);

exit(0);

}

————————————————

版权声明:本文为CSDN博主「风翼随心」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_42249237/article/details/81588317

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值