模拟网络通信中存储转发的分组交换算法
来源:互联网 发布: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
- 模拟网络通信中存储转发的分组交换算法
- 【网络基础】路由表,分组转发算法
- 网络层-转发分组的流程
- 分组转发算法
- 路由器分组转发算法
- 路由分组转发算法
- 10、分组转发算法
- 分组转发算法
- 电路交换、报文交换、分组交换、异步传输模式等通信交换技术的区别
- 用MFC实现的路由分组转发模拟系统
- 【IP层分组转发的流程】划分子网的情况下,分组转发的算法。
- 【通信】SNMP,电路交换,分组交换
- 【网络基础】子网划分、基于子网掩码的分组转发
- 【网络基础】电路交换、虚电路交换、分组交换的区别比较
- 【网络基础】电路交换、虚电路交换、分组交换的区别比较
- 三种交换网络:电路交换 报文交换 分组交换
- 在划分子网的情况下路由器转发分组算法
- 看图学网络 三 网络核心部分的数据交换(电路 报文 分组 交换)
- 常用开发web服务
- liunx 运维分类命令
- iOS开源项目之日志框架CocoaLumberjack
- android中ZoomControls 源码解析
- HTTP TRACE
- 模拟网络通信中存储转发的分组交换算法
- 将三星手机备忘录vnt格式文件转为txt格式备份
- 计划任务(TaskScheduler)深入探讨
- UPnP基本原理以及在NAT中的应用
- My bbs logs
- 古风风格DIV+CSS模板
- 几款常用UML建模工具介绍
- Oracle 特殊符号'&'的处理
- C++基类与派生类的函数调用情况