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


    概述:

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

    分组交换:

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

    部分代码如下:

    这个代码是从文件中读取数据,把读取到的数据存储在全局变量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.
    ");
            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.
    ");
        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] = '
    '; // 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
    ", str);
    
        fclose(fp_a);
        return OK;
    }

    源代码下载:

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

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


  • 相关阅读:
    elementUI .native修饰符
    JS密码强度检测
    HighChart中的tooltip的第一行数字明显比其他的字要小
    HighChart 不同颜色(柱状图)
    .NET(C#、VB)APP开发——Smobiler平台控件介绍:SliderView控件
    .NET(C#、VB)APP开发——Smobiler平台控件介绍:SignatureButton控件
    .NET(WinCE、WM)转Android开发——Xamarin和Smobiler对比
    MobileForm控件的使用方式-用.NET(C#)开发APP的学习日志
    你用.NET开发APP时,在云平台打包APP要填个“包名”的含义
    基于.NET的APP开发和Windows开发,异步回调差别
  • 原文地址:https://www.cnblogs.com/fengju/p/6336175.html
Copyright © 2020-2023  润新知