小说网 找小说 无限小说 烟雨红尘 幻想小说 酷文学 深夜书屋

模拟网络通信中存储转发的分组交换算法

概述:

在说明这个存储转发的分组交换算法,我想大家应该首先了解什么是分组交换。

分组交换:

    分组交换很简单,就是将接收端接收到的一连串数据先存储下来,然后进行分组(分组的目的是因为原数据长度太长,在通信中,因为噪音的干扰会失真重传。那么,这样的话发送者就必须从头开始将原数据再发送一次,这样的通信在数据量比较多的情况显然就会影响到通信效率),在分组的数据上进行添加首部,把这样添加地首部的数据放网络上进行传输。在目的端,再把分组的数据除掉首部,进行组装,即是一个还原的过程。

部分代码如下:

这个代码是从文件中读取数据,把读取到的数据存储在全局变量inform[]数组中;

/* -------------------------------- Reading File -------------------------------- */
int reading()
{
    
    FILE * fp_r;
    fp_r = fopen(READING_PATH, "r");
    if (fp_r == NULL)
    {
        printf("ERROR.your file is not being.\n");
        return ERROR;
    }    
    char temp;
    temp = fgetc(fp_r);    
    int i;
    memset(inform, 0, sizeof(inform));    
    for (i = 0; temp != EOF; ++i)
    {
        inform[i] = temp;
        temp = fgetc(fp_r);
    }

    fclose(fp_r);
    return OK;
}

拆分:

上面的代码中,数组inform即是原数据,下面我要对这个原数据进行分组拆分,将它分成若干个小分组,再添加自定义的一个首部,代码如下:

/* -------------------------------- Switch Packet Forwarding -------------------------------- */
int switchPacket()
{
    FILE * fp_s;
    fp_s = fopen(PACKET_SWITCHED_PATH, "a+");    
    printf("Defines a segment length.\n");
    int i, j;
    int sub_len, len, len_head;
    scanf("%d", &sub_len);
    len = strlen(inform);
    len_head = strlen(HEAD);

    char temp[TEMP_MAX];
    memset(temp, 0, sizeof(temp));
    strcpy(temp, HEAD); //  add head

    for (i = 0, j = len_head; i < len; ++i)
    {
        if ((i+1) % sub_len)
        {
            temp[j] = inform[i];
            ++j; // temp moving go back
        }
        else
        {
            temp[j] = inform[i]; // make up for location of sub_len
            ++j;            
            //temp[j] = '\n'; // new line
            fprintf(fp_s, "%s", temp); // write this packet to the file
            memset(temp, 0, sizeof(temp)); // redefine temp[]
            strcpy(temp, HEAD); //  add head
            j = len_head; // reset location of temp[]
        }
    }

    fclose(fp_s);

    AssembleFrame(len_head, sub_len);
    return OK;
}


还原:

而对分过组的数据段,必须还原,不然目的端接收到的数据就会是一串看不懂的字符串,即乱码,让人无法辨认。还原代码如下:

/* -------------------------------- Assemble Frame -------------------------------- */
int AssembleFrame(int front, int rear)
{
    FILE * fp_a;
    fp_a = fopen(PACKET_SWITCHED_PATH, "r");
    if (fp_a == NULL)
    {
        return ERROR;
    }
    char temp, swstr[MAX*2], str[MAX];
    temp = fgetc(fp_a);
    int i, j;
    memset(swstr, 0, sizeof(swstr));
    memset(str, 0, sizeof(str));
    for (i = 0; temp != EOF; ++i)
    {
        swstr[i] = temp;
        temp = fgetc(fp_a);
    }
    int len = strlen(swstr);
    for (i = 0, j = 0; i < len; ++i)
    {
        if ((i+1) % (front+rear) == 0 || (i+1) % (front+rear) > front) // get char from front to (front+rear)
        {
            str[j] = swstr[i];
            ++j;
        }        
    }
    printf("Group of data binding is: %s\n", str);

    fclose(fp_a);
    return OK;
}

源代码下载:

完整的程序代码,我放在了我的网易博客上了。感兴趣的朋友可以去看看,以下是连接。

http://blog.163.com/stone_sqrt3/blog/static/220412088201343011237752/


posted on 2014-04-17 11:27  王峰炬  阅读(251)  评论(0编辑  收藏  举报

导航