linux 进程带宽限制,C Linux应用程序的带宽限制

有什么方法可以尝试在loop循环中限制send / sendto()函数.我正在为我的网络创建一个端口扫描程序,我尝试了两种方法,但它们似乎只在本地工作(当我在家用机器上测试它们时它们工作但是当我尝试在另一台机器上测试它们时它不想创建适当的油门).

方法1

我最初解析/ proc / net / dev并读取“bytes sent”属性并将我的睡眠时间基于此.这在本地工作(睡眠延迟正在调整以调整带宽流量)但是一旦我在另一台服务器上尝试使用/ proc / net / dev,它似乎没有正确调整数据.我在我本地扫描的机器上运行dstat,它输出的数据很快.

方法2

然后,我尝试跟踪我发送的总字节数,并将其添加到我的带宽线程将读取的total_sent变量中,并为其计算睡眠定时器.这也适用于我的本地机器,但是当我在服务器上尝试它时,它说它每次我的带宽线程检查total_sent时只发送1-2个数据包使我的带宽线程将睡眠减少到0,但即使在0总数时也是如此变量没有因睡眠时间减少而增加,而是保持不变.

总的来说,我想要一种方法来监控Linux计算机的带宽,并计算一个休眠时间,我可以在每次发送/发送到()套接字调用之前或之后传入usleep()以限制带宽.

编辑:我忘了提到的其他一些事情是我有一个最快的功能,计算机器的上传速度,我有2个线程. 1个线程根据带宽使用情况调整全局睡眠定时器,线程2将数据包发送到远程机器上的端口以测试它们是否打开并对其进行指纹化(现在我只是使用带有sendto()的udp数据包进行测试这一切).

如何使用usleep()为send / sendto()调用实现带宽限制.

编辑:这是我的带宽监控线程的代码.不要关心结构的东西,它只是我将数据传递给线程的方式.

void *bandwidthmonitor_cmd(void *param)

{

int i = 0;

double prevbytes = 0, elapsedbytes = 0, byteusage = 0, maxthrottle = 0;

//recreating my param struct i passed to the thread

command_struct bandwidth = *((command_struct *)param);

free(param);

//set SLEEP (global variable) to a base time in case it was edited and not reset

SLEEP = 5000;

//find the maximum throttle speed in kb/s (takes the global var UPLOAD_SPEED

//which is in kb/s and times it by how much bandwidth % you want to use

//and devides by 100 to find the maximum in kb/s

//ex: UPLOAD_SPEED = 60, throttle = 90, maxthrottle = 54

maxthrottle = (UPLOAD_SPEED * bandwidth.throttle) / 100;

printf("max throttle: %.1f

", maxthrottle);

while(1)

{

//find out how many bytes elapsed since last polling of the thread

elapsedbytes = TOTAL_BYTES_SEND - prevbytes;

printf("elapsedbytes: %.1f

", elapsedbytes);

//set prevbytes to our current bytes so we can have results next loop

prevbytes = TOTAL_BYTES_SEND;

//convert our bytes to kb/s

byteusage = 8 * (elapsedbytes / 1024);

//throttle control to make it adjust sleep 20 times every 30~

//iterations of the loop

if(i & 0x40)

{

//adjust SLEEP by 1.1 gain

SLEEP += (maxthrottle - byteusage) * -1.1;//;

if(SLEEP < 0){

SLEEP = 0;

}

printf("sleep:%.1f

", SLEEP);

}

//sleep the thread for a short bit then start the process over

usleep(25000);

//increment variable i for our iteration throttling

i++;

}

}

我的发送线程只是一个简单的sendto()例程,在while(1)循环中发送udp数据包进行测试. sock是我的sockfd,buff是一个填充“A”的64字节字符数组,sin是我的sockaddr_in.

while(1)

{

TOTAL_BYTES_SEND += 64;

sendto(sock, buff, strlen(buff), 0, (struct sockaddr *) &sin, sizeof(sin))

usleep(SLEEP);

}

我知道我的套接字功能有效,因为我可以在本地机器和远程机器上看到dstat中的用法.这个带宽代码可以在我的本地系统上运行(所有变量都按照应有的方式改变)但是在服务器上我尝试对经过的字节进行测试不会改变(每次迭代的线程总是64/128)并导致SLEEP限制为0理论上应该使机器更快地发送数据包,但即使SLEEP等于0经过的时间仍然是64/128.我还在if语句中编写了sendto()函数,检查返回-1的函数,并通过printf -ing错误代码提醒我,但我在测试中没有一个.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值