Mad_Flute在65535个块后停止接收

时间:2018-11-27 20:17:55

标签: c udp diode

我正在玩一个叫做mad_flute的长笛协议应用程序。 http://mad.cs.tut.fi/

一切正常,除非我尝试发送大于30GB的文件。 (或超过65536个)块。 该应用程序具有1个发送部分和1个接收部分。 发送方接缝正在工作,您可以看到它发送了所有块 “发送了88462/88462源块(TOI = 1 SBN = 88461)” 接收方总是在“解码的65536/88462源块(TOI = 1 SBN = 65535)”处停止

我确实在源代码中找到了一个INT16变量,但是进行调整并不能解决问题。

接下来,我发现了一个逻辑“ Delta2 = 65535-Delat1;”。 mad_rlc.c中的一部分,并将该值增加,但仍收不到“ 65536/88462已解码源块(TOI = 1 SBN = 65535)”处的接收器

可以从以下网址下载来源:http://mad.cs.tut.fi/download/mad_fcl_v1.7_src.zip

来自C国王/女王的任何指针都将是惊人的。

int mad_rlc_check_sequence(alc_session_t *s, int layer, int seqid) {
unsigned short Delta1;
unsigned short Delta2;

int i;
int late_limit;

if(s->rlc->rx_wait_for[layer] == seqid) {
    /* This is the packet we're waiting for, let's go on! */
    s->rlc->rx_wait_for[layer]++;
    return 0;
}

/* This is not the one we're waiting for... */
if(s->rlc->rx_wait_for[layer] < seqid) {

    Delta1 = seqid - s->rlc->rx_wait_for[layer];
    Delta2 = 65535 - Delta1;

    if(Delta1 < Delta2) {

        late_limit = RLC_MAX_LATES;

        for(i = s->rlc->rx_wait_for[layer]; i < seqid; i++) {
            mad_rlc_add_late(s, layer, i);
            late_limit--;
            if(late_limit <= 0 ) {
                printf("RLC Warning*** Max number of LATE packets reached\n");
                fflush(stdout);
                break;
            }
        }
        /* EOFIX */
        s->rlc->rx_wait_for[layer] = seqid + 1;
    }
    else {
        /* Late arrival packet (uint16 overflow) */
        /* eg. we're waiting seq 4 and we get seq 65532 */
        mad_rlc_remove_late(s, layer, seqid);
    }
}
else { /* rx_wait_for > rlc_seqid */

    Delta1 = s->rlc->rx_wait_for[layer] - seqid;
    Delta2 = 65535 - Delta1;
    if (Delta1 < Delta2) { /* Late arrival packet */
    /* ie: we're waiting seq 501 and we get seq 498 */
        mad_rlc_remove_late(s, layer, seqid);
    }
    else {
    /* Some packet(s) are missing (uint16 overflow) */
    /* ie: waiting seq 65531 and get seq 3 */
        /* FIX 14/12/01 */
        late_limit = RLC_MAX_LATES;
        for(i = s->rlc->rx_wait_for[layer]; i != (seqid-1); i++) {
            mad_rlc_add_late(s, layer, i);
            late_limit--;
            if(late_limit <= 0 ) {
                printf("RLC Warning*** Max number of LATE packets reached\n");
                fflush(stdout);
                break;
            }
        }
        /* EOFIX */
        s->rlc->rx_wait_for[layer] = seqid + 1;
    }
}

return 0;

}

0 个答案:

没有答案