模拟网络通信中存储转发的分组交换算法
概述:
在说明这个存储转发的分组交换算法,我想大家应该首先了解什么是分组交换。
分组交换:
分组交换很简单,就是将接收端接收到的一连串数据先存储下来,然后进行分组(分组的目的是因为原数据长度太长,在通信中,因为噪音的干扰会失真重传。那么,这样的话发送者就必须从头开始将原数据再发送一次,这样的通信在数据量比较多的情况显然就会影响到通信效率),在分组的数据上进行添加首部,把这样添加地首部的数据放网络上进行传输。在目的端,再把分组的数据除掉首部,进行组装,即是一个还原的过程。
部分代码如下:
这个代码是从文件中读取数据,把读取到的数据存储在全局变量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/