首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择重发ARQ中的定时器

选择重发ARQ中的定时器
EN

Stack Overflow用户
提问于 2015-05-24 15:10:08
回答 2查看 3.2K关注 0票数 1

我的教授给了我一个任务,让我用C语言实现选择性重复ARQ算法,用于发送方和接收方之间的数据包处理。存在与要在发送器处发送的每个分组相关联的定时器,该定时器在该分组被发送时被触发,根据该定时器来确定需要发送哪个分组副本。

但是我不知道如何设置每个数据包的计时器。请推荐一些解决方法。

感谢是前进!!

EN

回答 2

Stack Overflow用户

发布于 2015-05-24 21:57:42

  1. 保留一个数据结构(例如优先级队列或有序映射等),其中包含您计划(重新)发送的每个数据包,以及您打算(重新)发送它的时间。理想情况下,此数据结构可以有效地确定数据结构中当前最小的时间戳,但如果调度的数据包数量相对较少,则也可以使用更简单的无序数据结构(如链表)。
  2. 在每次迭代事件循环时,确定数据结构中的最小时间戳值。从时间戳值中减去current time,得到一个延迟时间(以毫秒或微秒为单位)。
  3. 如果使用select()或类似方法,则可以将该延迟时间作为超时参数传递。如果你正在做一些没有多路复用的简单的事情,你也许可以将延迟时间传递给usleep()或类似的方法。
  4. 在select() (或usleep())返回后,再次检查当前时间。如果当前时间大于或等于目标时间,则可以发送时间戳最小的数据包,然后将其从数据结构中删除。(如果您认为以后可能需要重新发送它,则可以使用新的/更新的时间戳值将其重新插入到数据结构中)
票数 2
EN

Stack Overflow用户

发布于 2016-10-14 09:32:08

您也可以使用Thread来实现此目的,这非常简单,并且需要的代码行更少。

您只需要创建和定义此函数:

代码语言:javascript
复制
unsigned long CALLBACK packetTimer(void *pn){

    //This is our Packet Timer
    //It's going to run on a Tread
    //If ack[thisPacketNumber] is not true
    //We gonna check will check for packet time
    //If it's reached to its limit we gonna send this packet again
    //and reset the timer

    //If ack[] becomes true 
    //break the while loop and this will end this tread
    int pno = (int)pn;
    std::clock_t start;
    double duration;

    start = std::clock();

    while(1){

        if(!ack[pno]){

            duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;

            if(duration > 0.5){
                //This tells that we haven't received our ACk yet for this packet
                //So send it again

                printf("SendBuffer for Packet %d: %s", pno, packets[pno]->data);
                //Resending packet again
                send_unreliably(s,packets[pno]->data,(result->ai_addr));

                //Reseting the timer
                start = std::clock();

            }

        }else{break;}

    }


}

在while循环中,向接收方发送和接收数据包,只需定义:

代码语言:javascript
复制
unsigned long tid;//This should be outside the while loop,
                  //Ideally in the beginning of main function

CreateThread(NULL,0,packetTimer,(void *)packetNumber,0,&tid);

这个实现是针对windows的,对于UNIX,我们需要使用pthread()

就是这个。别忘了添加所需的头文件,如:

代码语言:javascript
复制
#include <stdlib.h>
#include <cstdio>
#include <ctime>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30420971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档