我尝试在C 中实施通信协议。我需要实现一个计时器(这样如果在一段时间之后还没有收到ACK,发送方将认为数据包已丢失并将再次发送)。
在C-looking-pseudocode中,我希望有这样的东西:
if (!ack_received(seqn) && timer_expired(seqn)) {
send_packet(seqn);
start_timer(seqn);
}
注意:seqn
是正在发送的数据包的序列号。 每个数据包都需要一个个人计时器。
如何实施timer_expired
和start_timer
?有没有办法在不使用多个线程的情况下完成它?
答案 0 :(得分:1)
我可以在C中实现单线程计时器吗?
可能不是纯手提式C99(或单线程C11,请参阅n1570)。
但在实践中,您通常会编写一些operating system的代码,然后您将获得一些定时器的方法。在Linux上,首先阅读time(7)。您可能还想使用多路复用调用,例如poll(2)(您给予延迟)。并详细了解其他system calls,请阅读intro(2),syscalls(2)和一些优秀的Linux编程手册(也许是旧的ALP,可以免费下载)。
顺便说一句,看来你正在编写网络相关的东西。你几乎需要一些API(例如Berkeley sockets),因此你可能会使用类似于操作系统的东西。许多event loops是单线程的,但提供某种计时器。
或许(如果你没有任何操作系统)你正在为一些小型嵌入式硬件平台编写一些独立的C(例如Arduino - )。然后你有一些方法来轮询网络输入和设置计时器。
答案 1 :(得分:0)
取决于您系统的架构,它可以或多或少地以优雅的方式完成。
在具有单个线程的简单程序中,只声明包含起始时间戳的表。因此该函数只检查当前时间戳,保存的时间和超时值之间的差异。您需要实现另一个函数,该函数将初始化特定超时计数器的表元素。