概述:

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

分组交换:

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

部分代码如下:

这个代码是从文件中读取数据,把读取到的数据存储在全局变量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/

模拟网络通信中存储转发的分组交换算法相关推荐

  1. 网络通信中TCP出现的黏包以及解决方法 socket 模拟黏包

    粘包问题概述 1.1  描述背景 采用TCP协议进行网络数据传送的软件设计中,普遍存在粘包问题.这主要是由于现代操作系统的网络传输机制所产生的.我们知道,网络通信采用的套接字(socket)技术,其实 ...

  2. java模拟实现操作系统进程调度中的多级反馈队列算法

    java模拟实现操作系统进程调度中的多级反馈队列算法 操作系统学了一学期了,期末作业布置下来,用编程语言模拟进程调度的过程,只会java,于是就写了一下,通过控制台模拟,模拟过程看起来可能十分不直观. ...

  3. 网络通信中的加密解密及openssl和创建私有CA详解

    本文大纲: 1.为什么网络通信要进行数据加密? 2.数据加密方式有哪些?它们是如何进行加密的? 3.通信中是如何进行数据加密传输的? 4.https方式进行数据传输的具体流程 5.SSL 的实现工具O ...

  4. 还在为数学建模的事发愁?带你一起来看看数模竞赛中必备的经典算法

    前言 数学建模比赛是本科生和研究生阶段最重要的比赛之一,包括全国大学生数学建模竞赛(俗称"国赛")和美国大学生数学建模竞赛(俗称"美赛").在这些比赛中取得好成 ...

  5. 数据结构 - 二叉树 - 面试中常见的二叉树算法题

    数据结构 - 二叉树 - 面试中常见的二叉树算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图 ...

  6. java linux 权限管理_权限管理java实现(源于Linux中的权限管理算法)

    这个帖子由来已久吧,我也是到处搜到的,然后仔细学习,果然博大精深,然后加强点弄点自己的东西 我已声明 部分转载!! 向大家介绍一种很不错,也是Linux中的权限管理算法. 定义a^b为:a的b次方 假 ...

  7. OPT和LRU页面置换算法C语言代码,页面置换算法模拟——OPT、FIFO和LRU算法.doc

    实用标准文案 精彩文档 操作系统实验报告 页面置换算法模拟 --OFT.FIFO和LRU算法 班级:2013级软件工程1班 学号:X X X 姓名:萧氏一郎 数据结构说明: Memery[10]物理块 ...

  8. 计算机视觉子方向,计算机视觉方向简介 | 人脸识别中的活体检测算法综述

    原标题:计算机视觉方向简介 | 人脸识别中的活体检测算法综述 本文转载自"SIGAI人工智能学习与实践平台"(ID:SIGAICN) 导言 1. 什么是活体检测? 判断捕捉到的人脸 ...

  9. H.264解码器中CAVLC码表查找算法的分析与优化

    0 引言    近年来,随着信息技术飞速发展和互联网的日益普及,尤其是以视频为信息主要来源的多媒体领域越来越受到人们的关注.H.264是ITU-T的视频编码专家组(VCEG)和ISO/IEC的活动图像 ...

最新文章

  1. AlexNet中的局部响应归一化(LRN)
  2. 国外17个非常热门的在线备份服务
  3. 探索Javascript 异步编程
  4. Linux关机运行的脚本,Linux 关机 脚本
  5. 以太网MDIO总线调试笔记
  6. 关于DiskGenius 克隆分区和系统迁移问题,以及如何解决缺少系统引导、双硬盘双系统引导问题,多个启动项
  7. 二元二次方程 c语言,C语言求二元二次方程组的解 我要代码 谢谢大家了
  8. 电力猫服务器的网页,电力猫怎么配对?快速配置电力猫的图文教程
  9. Linux I2C从设备树信息查看与添加方法
  10. 工具篇:TailScale免费实现远程设备互连(无费用方案,亲测,零基础安装),支持手机、Windows或linux系统、NAS
  11. RTX3080 Ti 怎么样 RTX3080 Ti性能相当于什么水平
  12. Problem B: 薪酬计算 之二
  13. linux fping命令使用
  14. SpringCloud相关重难点解析
  15. 杰理之 MIC录音 vbat电压低于3.2v会有很强的底噪?【篇】
  16. Linux无法显示ip的解决办法
  17. 【C语言程序设计】实验 12
  18. 12c oracle 修改内存_Oracle12c中性能优化amp;功能增强新特性之重大突破——内存列存储新特性...
  19. linux学习软件有哪些,Linux学习12个有效果软件!看看哪些你用得上
  20. pytorch加载模型报错Unexpected key(s) in state_dict: module.conv1.weight, module.bn1

热门文章

  1. C++ Primer 5th笔记(6)chapter6 函数:函数指针
  2. 公钥密码--Diffie-Hellman密钥协商算法
  3. 【Flask】Jinja2模板之过滤器
  4. [reference]-ARM/TEE/security等论文中的缩写和参考文献
  5. 在Ubuntu系统中安装Docker
  6. linux xargs 前一条命令的输出作为下一条命令的参数
  7. 攻击面管理(ASM),企业攻击面管理实践指南
  8. 160个Crackme007
  9. 1.5 @SafeVarargs注解
  10. 1.2 Java类的定义