C语言发送SYN数据包,有什么好的速度控制办法吗
在用C做SYN扫描的时候,数据包的发送速度不能很好控制(原生套接字),如果速度过快 丢包率很严重,我研究了了Zmap的速度控制,它是在网速比较慢的时候通过休眠控制 网速快的时候通过增加cpu计算来增加发送间隔,但是这样的话 CPU占用太高,请问有什么好的办法吗?
Zmap的实现:
while (1) { // adaptive timing delay send_rate = (double) zconf.rate / zconf.senders; //速度控制核心 if (delay > 0) { count++; //针慢的网速 通过休眠 控制 if (send_rate < slow_rate) { double t = now(); double last_rate = (1.0 / (t - last_time)); sleep_time *= ((last_rate / send_rate) + 1) / 2; ts.tv_sec = sleep_time / nsec_per_sec; ts.tv_nsec = sleep_time % nsec_per_sec; log_debug("sleep", "sleep for %d sec, %ld nanoseconds", ts.tv_sec, ts.tv_nsec); while (nanosleep(&ts, &rem) == -1) {} last_time = t; } else { //针对非常快的网速 通过增加cpu消耗 for (vi = delay; vi--; ) ; if (!interval || (count % interval == 0)) { double t = now(); delay *= (double)(count - last_count) / (t - last_time) / (zconf.rate / zconf.senders); if (delay < 1) delay = 1; last_count = count; last_time = t; } } } ..... sendto(); ....... }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
网速慢的话 还行,网速快的话 两个包之间的时间差很小 休眠根本不起作用,不过可以通过for循环消耗一定的时间 但是cpu占用太高了(我用zmap扫描就是存在cpu太用太高的问题)
回复
@紫系流月 : buf设置大一些。如果网速要求还快,就做个判断,进入另一种连发模式。哈。
给个思路,是否可行,要看你的系统的情况了。正常这种发送都是有buf的,底层的。你按照buf的大小,设定具体的一次发生的容量。将你所要发送的任务,切割成这些容量小包。对于发送速度的控制,则是针对这些小包发送时间来确定。 简单的方式如:
1、发送一个小包,
2、是否发送完毕,如果完毕则结束
3、 获取当前时间
4、根据当前速度确定下一个包的发送时间
5、 睡眠上述两个包的时间差
6、转1
Linux啊 也可以吗
回复
@紫系流月 : 当然可以
高精度定时器