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

来源:互联网 发布:java的工资一般多少 编辑:程序博客网 时间:2024/05/17 09:12

概述:

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

分组交换:

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

部分代码如下:

这个代码是从文件中读取数据,把读取到的数据存储在全局变量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/


1 0
原创粉丝点击