模拟网络通信中存储转发的分组交换算法
概述:
在说明这个存储转发的分组交换算法,我想大家应该首先了解什么是分组交换。
分组交换:
分组交换很简单,就是将接收端接收到的一连串数据先存储下来,然后进行分组(分组的目的是因为原数据长度太长,在通信中,因为噪音的干扰会失真重传。那么,这样的话发送者就必须从头开始将原数据再发送一次,这样的通信在数据量比较多的情况显然就会影响到通信效率),在分组的数据上进行添加首部,把这样添加地首部的数据放网络上进行传输。在目的端,再把分组的数据除掉首部,进行组装,即是一个还原的过程。
部分代码如下:
这个代码是从文件中读取数据,把读取到的数据存储在全局变量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 headfor (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 linefprintf(fp_s, "%s", temp); // write this packet to the filememset(temp, 0, sizeof(temp)); // redefine temp[]strcpy(temp, HEAD); // add headj = 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/
模拟网络通信中存储转发的分组交换算法相关推荐
- 网络通信中TCP出现的黏包以及解决方法 socket 模拟黏包
粘包问题概述 1.1 描述背景 采用TCP协议进行网络数据传送的软件设计中,普遍存在粘包问题.这主要是由于现代操作系统的网络传输机制所产生的.我们知道,网络通信采用的套接字(socket)技术,其实 ...
- java模拟实现操作系统进程调度中的多级反馈队列算法
java模拟实现操作系统进程调度中的多级反馈队列算法 操作系统学了一学期了,期末作业布置下来,用编程语言模拟进程调度的过程,只会java,于是就写了一下,通过控制台模拟,模拟过程看起来可能十分不直观. ...
- 网络通信中的加密解密及openssl和创建私有CA详解
本文大纲: 1.为什么网络通信要进行数据加密? 2.数据加密方式有哪些?它们是如何进行加密的? 3.通信中是如何进行数据加密传输的? 4.https方式进行数据传输的具体流程 5.SSL 的实现工具O ...
- 还在为数学建模的事发愁?带你一起来看看数模竞赛中必备的经典算法
前言 数学建模比赛是本科生和研究生阶段最重要的比赛之一,包括全国大学生数学建模竞赛(俗称"国赛")和美国大学生数学建模竞赛(俗称"美赛").在这些比赛中取得好成 ...
- 数据结构 - 二叉树 - 面试中常见的二叉树算法题
数据结构 - 二叉树 - 面试中常见的二叉树算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图 ...
- java linux 权限管理_权限管理java实现(源于Linux中的权限管理算法)
这个帖子由来已久吧,我也是到处搜到的,然后仔细学习,果然博大精深,然后加强点弄点自己的东西 我已声明 部分转载!! 向大家介绍一种很不错,也是Linux中的权限管理算法. 定义a^b为:a的b次方 假 ...
- OPT和LRU页面置换算法C语言代码,页面置换算法模拟——OPT、FIFO和LRU算法.doc
实用标准文案 精彩文档 操作系统实验报告 页面置换算法模拟 --OFT.FIFO和LRU算法 班级:2013级软件工程1班 学号:X X X 姓名:萧氏一郎 数据结构说明: Memery[10]物理块 ...
- 计算机视觉子方向,计算机视觉方向简介 | 人脸识别中的活体检测算法综述
原标题:计算机视觉方向简介 | 人脸识别中的活体检测算法综述 本文转载自"SIGAI人工智能学习与实践平台"(ID:SIGAICN) 导言 1. 什么是活体检测? 判断捕捉到的人脸 ...
- H.264解码器中CAVLC码表查找算法的分析与优化
0 引言 近年来,随着信息技术飞速发展和互联网的日益普及,尤其是以视频为信息主要来源的多媒体领域越来越受到人们的关注.H.264是ITU-T的视频编码专家组(VCEG)和ISO/IEC的活动图像 ...
最新文章
- AlexNet中的局部响应归一化(LRN)
- 国外17个非常热门的在线备份服务
- 探索Javascript 异步编程
- Linux关机运行的脚本,Linux 关机 脚本
- 以太网MDIO总线调试笔记
- 关于DiskGenius 克隆分区和系统迁移问题,以及如何解决缺少系统引导、双硬盘双系统引导问题,多个启动项
- 二元二次方程 c语言,C语言求二元二次方程组的解 我要代码 谢谢大家了
- 电力猫服务器的网页,电力猫怎么配对?快速配置电力猫的图文教程
- Linux I2C从设备树信息查看与添加方法
- 工具篇:TailScale免费实现远程设备互连(无费用方案,亲测,零基础安装),支持手机、Windows或linux系统、NAS
- RTX3080 Ti 怎么样 RTX3080 Ti性能相当于什么水平
- Problem B: 薪酬计算 之二
- linux fping命令使用
- SpringCloud相关重难点解析
- 杰理之 MIC录音 vbat电压低于3.2v会有很强的底噪?【篇】
- Linux无法显示ip的解决办法
- 【C语言程序设计】实验 12
- 12c oracle 修改内存_Oracle12c中性能优化amp;功能增强新特性之重大突破——内存列存储新特性...
- linux学习软件有哪些,Linux学习12个有效果软件!看看哪些你用得上
- pytorch加载模型报错Unexpected key(s) in state_dict: module.conv1.weight, module.bn1
热门文章
- C++ Primer 5th笔记(6)chapter6 函数:函数指针
- 公钥密码--Diffie-Hellman密钥协商算法
- 【Flask】Jinja2模板之过滤器
- [reference]-ARM/TEE/security等论文中的缩写和参考文献
- 在Ubuntu系统中安装Docker
- linux xargs 前一条命令的输出作为下一条命令的参数
- 攻击面管理(ASM),企业攻击面管理实践指南
- 160个Crackme007
- 1.5 @SafeVarargs注解
- 1.2 Java类的定义