【发布时间】:2018-06-25 07:20:06
【问题描述】:
我正在尝试在 C 中实现 通信协议。我需要实现一个计时器(这样如果一段时间后还没有收到 ACK,发送方会认为数据包已经丢失,然后再次发送)。
在一个看起来像 C 的伪代码中,我想要这样的东西:
if (!ack_received(seqn) && timer_expired(seqn)) {
send_packet(seqn);
start_timer(seqn);
}
注意:seqn 是正在发送的数据包的序列号。 每个数据包都需要一个个人计时器。
timer_expired和start_timer如何实现?有没有办法在不使用多个线程的情况下做到这一点?
【问题讨论】:
-
IO是非阻塞的吗?
-
如果没有具体的系统,这个问题就太宽泛了。这必须以系统/操作系统特定的方式完成。
-
这段代码在哪个平台或操作系统上运行?请编辑您的问题以改进它(至少,通过更精确地标记它,例如 Linux、winapi 等...)
-
如果是 Linux 则可以使用
timer_create(),查看此手册页以获取 timer_create() -
my old answers 之一显示了一种可能的方法。如果并发活动超时的数量很高,那么绝对时间使用最小堆会更有效(对于只有十几个或两个插槽,不要打扰)。请注意,该示例安装了没有
SA_RESTART标志的计时器信号处理程序,因此它的传递将中断任何阻塞 I/O 操作(如果进程中只有一个线程)。