模拟网络通信中存储转发的分组交换算法
2014-04-17 11:27
399 查看
概述:
在说明这个存储转发的分组交换算法,我想大家应该首先了解什么是分组交换。
分组交换:
分组交换很简单,就是将接收端接收到的一连串数据先存储下来,然后进行分组(分组的目的是因为原数据长度太长,在通信中,因为噪音的干扰会失真重传。那么,这样的话发送者就必须从头开始将原数据再发送一次,这样的通信在数据量比较多的情况显然就会影响到通信效率),在分组的数据上进行添加首部,把这样添加地首部的数据放网络上进行传输。在目的端,再把分组的数据除掉首部,进行组装,即是一个还原的过程。
部分代码如下:
这个代码是从文件中读取数据,把读取到的数据存储在全局变量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/
相关文章推荐
- 模拟网络通信中存储转发的分组交换算法
- 模拟网络通信中存储转发的分组交换算法
- 【通信】SNMP,电路交换,分组交换
- 黑马程序员--图形界面中的鼠标,键盘两个事件,做一个磁盘的文件列表,菜单,子菜单,模拟记事本。网络编程,TCP的通信协议的特点
- 计算机网络之路由器与分组交换
- 无线/移动通信的发展终极目标是,实现个人通信PCN是人类通信的最高目标,它指使用各种可能的网络技术,实现任何人在任何时间、任何地点与任何人进行任何何种类的信息交换。
- 透彻理解---现如今网络交换技术 --- --分组交换Packet Switch,缩写为PS。
- 在划分子网的情况下路由器转发分组算法
- 计算机网络复习 主题2 :为什么因特网采用分组交换的方式进行数据交换
- 计算机网络--报文交换vs分组交换
- 将计算机思维故事化——之计算机网络电路交换和分组交换
- 计算机网络之路由器与分组交换
- 电路交换、报文交换、分组交换、异步传输模式等通信交换技术的区别
- 计算机网络(分组交换与电路交换)
- 三种交换网络:电路交换 报文交换 分组交换
- 交换网络内的流量异常转发问题
- 第三讲 DICOM消息交换和网络通信
- 客户端网络pomelo学习笔记 (3) node.js 与 c 客户端 Diffie-Hellman 密钥交换算法的实现客户端网络
- 网络层——IP分组交换及NAT技术
- 计算机网络:分组交换与电路交换的比较