一个数据包发送的问题

uusunny 2008-11-05 10:07:50
现有N个数据包要在一秒内发送,N的大小由用户输入
要让这N个包随机性的发送出去,就是说每发一次包后下一次发数据包的时刻距离上回发送时间间隔完全是随机性的,但就是要保证发送的数据包在一秒内的总个数是N个,一次可以发送多个包,然后延时,一次延时的最小单位是10ms
...全文
170 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
leank 2008-11-07
  • 打赏
  • 举报
回复
total_delay = 1000 - tsend*N 如果同时发了2个包是不是就是total_delay = 1000 - tsend*(N-1) ?

[Quote=引用 13 楼 freshairfly 的回复:]
引用 12 楼 leank 的回复:
total_delay的表达式是不是就有问题了呢?

引用 10 楼 freshairfly 的回复:
引用 8 楼 leank 的回复:
楼主题意应该是忽略发送时间的。同时楼主还说了,有可能同时发送多个包,LS的好像没有注意到这一点。

我的写法是存在一次发送多个的概率的:
delay = (one_delay + random()%one_delay)/10*10;
这个表达式可以算出0



有什么问题?
[/Quote]
freshairfly 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 leank 的回复:]
total_delay的表达式是不是就有问题了呢?

引用 10 楼 freshairfly 的回复:
引用 8 楼 leank 的回复:
楼主题意应该是忽略发送时间的。同时楼主还说了,有可能同时发送多个包,LS的好像没有注意到这一点。

我的写法是存在一次发送多个的概率的:
delay = (one_delay + random()%one_delay)/10*10;
这个表达式可以算出0

[/Quote]

有什么问题?
leank 2008-11-05
  • 打赏
  • 举报
回复
total_delay的表达式是不是就有问题了呢?

[Quote=引用 10 楼 freshairfly 的回复:]
引用 8 楼 leank 的回复:
楼主题意应该是忽略发送时间的。同时楼主还说了,有可能同时发送多个包,LS的好像没有注意到这一点。

我的写法是存在一次发送多个的概率的:
delay = (one_delay + random()%one_delay)/10*10;
这个表达式可以算出0
[/Quote]
freshairfly 2008-11-05
  • 打赏
  • 举报
回复
int total_delay = 1000 - tsend*N;
int one_delay = total_delay/N; // 平均每个包的延迟
for (int i = 0; i < N; i++)
{
int delay = 0;
if (total_delay > 0)
{
delay = (one_delay + random()%one_delay)/10*10; // 假设这个随机函数可以返回负值
if (delay > total_delay)
delay = total_delay;
total_delay -= delay;
}

if (i == N -1) // 如果是最后一个packet,用完所有的延迟
delay += total_delay;
sleep(delay);
send_packet();
}

freshairfly 2008-11-05
  • 打赏
  • 举报
回复
前面完全随机不可能了.
假设发送一个包的时间是tsend,那么发送N个包没有延迟的时间是tsend*N,所以可以用来延迟的时间是1000-tsend*N

伪码:
int total_delay = 1000 - tsend*N;
int one_delay = total_delay/N;
for (int i = 0; i < N; i++)
{
int delay = 0;
if (total_delay > 0)
{
delay = (one_delay + random()%one_delay)/10*10; // 假设这个随机函数可以返回负值
if (delay > total_delay)
delay = total_delay;
total_delay -= delay;
}

if (i == N -1) // 如果是最后一个packet,用完所有的延迟
delay = total_delay;
sleep(delay);
send_packet();
}
yf001002 2008-11-05
  • 打赏
  • 举报
回复
先顶起来在说!
jingyuge 2008-11-05
  • 打赏
  • 举报
回复
ER......
[Quote=引用 3 楼 pingzi_1119 的回复:]
不好意思
我也不会
只能帮顶~
[/Quote]
pingzi_1119 2008-11-05
  • 打赏
  • 举报
回复
不好意思
我也不会
只能帮顶~
nicholas100 2008-11-05
  • 打赏
  • 举报
回复
学习……
hhyttppd 2008-11-05
  • 打赏
  • 举报
回复
UP,不知道你要问什么。
Arthur_ 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 uusunny 的帖子:]
现有N个数据包要在一秒内发送,N的大小由用户输入
要让这N个包随机性的发送出去,就是说每发一次包后下一次发数据包的时刻距离上回发送时间间隔完全是随机性的,但就是要保证发送的数据包在一秒内的总个数是N个,一次可以发送多个包,然后延时,一次延时的最小单位是10ms
[/Quote]

这种需求基本不能实现。
freshairfly 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 leank 的回复:]
楼主题意应该是忽略发送时间的。同时楼主还说了,有可能同时发送多个包,LS的好像没有注意到这一点。
[/Quote]
我的写法是存在一次发送多个的概率的:
delay = (one_delay + random()%one_delay)/10*10;
这个表达式可以算出0
沙漠里的海豚 2008-11-05
  • 打赏
  • 举报
回复

不知道楼主什么意思?

如果说要使这n个包在1s内发送完成,而且两个包之间的发送间隔随机的话,怕是只能在编程前通过估算来确保这一点。

当然也可以通过编程来实现,不过那样的话怕是要专门写一个算法用来计算时间间隔并保证从发送第一个包到最后一个包所经过的总时间不会超过1s了。

如果楼主单纯地只是想尝试一下而不是有实际用途的话,可以把n个包组装成一个直接发送,然后等待到1s就可以了。

当然,这里的前提都是忽略发送时间的。

通过socket发送一次的时间大约在20ms左右,如果你想要精确时间,自己写个定时器。
leank 2008-11-05
  • 打赏
  • 举报
回复
楼主题意应该是忽略发送时间的。同时楼主还说了,有可能同时发送多个包,LS的好像没有注意到这一点。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧