首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何编写模块化的网络代码?

如何编写模块化的网络代码?
EN

Stack Overflow用户
提问于 2013-03-30 08:42:34
回答 1查看 767关注 0票数 3

我有一个任务,在其中我必须实现几个网络协议。分配包括理想连接上的通信(不丢失或损坏数据)和破坏数据的连接。我想让它尽可能的模块化,但是我想不出怎么做(所有的事情似乎都交织在一起)。以下是我要做的事情清单:

  • 滑动窗口。此任务假定有完美的连接。但是,我想抽象出这个细节(实现滑动窗口代码,以便处理连接的质量是其他一些模块的责任)。
  • 不完美连接的回传-N协议.在这里,我想重用以前涉及滑动窗口的任务中的代码。
  • 选择性重复。这听起来像它应该取代回溯-N模块,而仍然工作在滑动窗口模块顶部。
  • 错误检测。这个看起来应该独立于我是否使用滑动窗口,回溯-N或选择性重复。然而,我不知道如何将错误检查与消息接收分开。

也许我可以实现一种分层架构(受OSI模型的启发),但我不知道如何实现。我需要一个正确的方向。

这些不同的模块应该如何相互交互呢?这样,无论我是否要填充数据链接(滑动窗口),返回-N或选择性重复功能都是独立的,并且在所有这些基础上进行错误检查是透明的。

编辑:的另一个困难是某些协议(回传-N、选择性重复、滑动窗口)需要特定于该协议的状态,而且在C中没有实现有状态函数的好方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-30 12:12:15

也许你可以用链式函数工作?

最初,您可以拥有一个struct connection,其中包含void (*write)(struct connection *con, char *buf, size_t len, void *data);void *write_data;int (*get_write_queue_size)(struct connection *con, void *data)void *get_write_queue_size_data等字段。首先,您将用处理理想连接的函数填充它。

然后,为了添加一个滑动窗口,您将生成一个struct sliding_window_connection,其中包含要拦截的来自struct connection的所有字段。然后,将旧函数和数据指针从struct connection移到struct sliding_window_connection中,将struct connection中的函数替换为滑动窗口实现,并将struct connection中的数据指针替换为指向struct sliding_window_connection的指针。例如,新的write看起来有点像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void sliding_window_connection_write
      (struct connection *con, char *buf, size_t len, void *data) {
  struct sliding_window_connection *swcon = data;
  /* ... do magic for the sliding window ... */
  /* if we want the buffer to be sent now, call the lower layer like this: */
  swcon->write(con, buf, len, swcon->write_data);
}

对于在顶部堆叠回传n或选择性重复,你可以添加回溯-n或选择性重复功能相同的方式。

在阅读过程中,你基本上也会这样做--让数据在各层中鼓起,并在途中对其进行操作或解释。

为了更好地工作,您可能需要添加一个类似于write的函数,该函数可以被一个层(例如回传-n)用来向较低层(例如滑动窗口)发送信号,例如“嘿,请重新发送字节m->n,谢谢”。

由于错误检测必须发生在比这些事情更高的级别上,所以您必须在其他事情之后添加它--添加的时间越晚,它的层越高。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15720943

复制
相关文章
使用requirejs编写模块化代码
写在前面 最早接触javascript的时候,javascript代码直接扔在script标签里面就完事了。 反正代码不多,交互简单,逻辑不难,和HTML混在一起也未尝不可。 后来交互越来越复杂,代码越多越多了,我们就开始把JS代码独立到了单独的JS文件中。 公共的库引用在前,自己的逻辑代码引用在后,全局变量定义在HTML内部,在独立JS文件中直接使用变量就好。 我们会经常看到下面这种代码: 123456 <script src="1.js"></script>  <script src="2.js"></
李国宝
2018/06/19
1K0
如何编写可靠的代码
介绍 当你得到一个小older-my但你妻子说我不是老愤世嫉俗者。这是为什么许多老男人不要说(或写)那么多:我们知道没有人注意。当你获得AARP另一个问题是,你相信你知道什么是真理,其他的都是废话。 本着这一精神,我可以这篇文章题为“结对编程是输家,”“为什么你的代码很烂,”或“经理是白痴,”但我确信琼斯先生不会打印。我可以告诉你的是,我能写的就是我所相信的,不是你想听到的或者是受欢迎的。很多人想听或相信什么是错的。 978年我写了第一行代码。可能有人会说我在1988年第一次得到这样做,我没有做其他。,阅读
用户1289394
2018/02/27
1.4K0
如何编写可怕的 Java 代码?
我决定告诉你如何编写可怕的Java代码。如果你厌倦了所有这些美丽的设计模式和最佳实践,并且想写些疯狂的东西,请继续阅读。
芋道源码
2020/03/02
9310
如何编写可怕的 Java 代码?
我决定告诉你如何编写可怕的Java代码。如果你厌倦了所有这些美丽的设计模式和最佳实践,并且想写些疯狂的东西,请继续阅读。
Java技术栈
2020/02/21
1K0
如何编写漂亮的 React 代码?
React 代码很难看。我不是在谈论这个框架的任何技术特性;我说的是直观的美学,代码在我屏幕上的样子,以及它所唤起的感觉。
深度学习与Python
2021/01/20
9830
如何编写可怕的Java代码?
我决定告诉你如何编写可怕的Java代码。如果你厌倦了所有这些美丽的设计模式和最佳实践,并且想写些疯狂的东西,请继续阅读。
武培轩
2019/12/12
9520
如何编写没有bug的代码?
我记不了很多东西。像标准库中的函数和方法、参数位置、软件包名称,样板代码等等,都在我脑容量之外。
老九君
2018/09/21
8980
如何编写没有bug的代码?
如何提高编写代码的速度?
如何提高代码编写的速度,一直是一个逃避不了的问题。在天朝你得像打字员一样做程序员,不然老板和上司都觉得你是在玩耍。对项目的贡献体现在哪里?码农难道不是以code量来体现的么,就跟码砖一样,看谁码的面积多快,那工作量就在哪里摆着的嘛。 一个牛逼工程师就一定会五笔?这个比喻不是很恰当。但是在码字上来说五笔是最快的没有之一。但编程真的是这样的吗?我认为绝不等于代码量除以时间就等于你编写代码的速度。 的确如果你是一个刚入门的编程新手,速度和量是你要追求的,为什么要这么讲呢?基础知识的熟练度直接体现出你编码的速度。速
程序员互动联盟
2018/03/15
2.9K0
如何提高编写代码的速度?
如何编写漂亮的 JavaScript 代码
这是一条编程领域流传久远的规则。严格遵守这条规则会让你的代码可读性更好,也更容易重构。如果违反这个原则,那么代码会很难被测试或者重用。
小鑫
2022/02/23
7960
如何编写线程安全的代码?
相信有很多同学在面对多线程代码时都会望而生畏,认为多线程代码就像一头难以驯服的怪兽,你制服不了这头怪兽它就会反过来吞噬你。
用户1516716
2021/01/18
7580
如何编写线程安全的代码?
编写模块化CSS——BEM
本文翻译自Zell的博客——【Writing modular CSS (Part 1) — BEM】,原文地址:https://zellwk.com/blog/css-architecture-1/
用户1687375
2018/06/08
2.1K0
如何编写简练清晰的HTML代码?
如何提升 Web 页面的性能,很多开发人员从多个方面来下手如 JavaScript、图像优化、服务器配置,文件压缩或是调整 CSS。 很显然 HTML 已经达到了一个瓶颈,尽管它是开发 Web 界面必备的核心语言。HTML 页面的负载也是越来越重。大多数页面平均需要40K的空间,像一些大型网站会包含数以千计的 HTML 元素,页面Size会更大。 如何有效的降低 HTML 代码的复杂度和页面元素的数量,本文主要解决了这个问题,从多个方面介绍了如何编写简练,清晰的 HTML 代码,能够使得页面加载更为迅速,且
用户1667431
2018/04/18
1.9K0
如何编写代码审查文档
代码审查(Code Review)是开发流程中非常重要的一个环节,可以帮助发现并改正代码中的错误,提高代码质量,也是共享知识、熟悉代码的好机会。
明明如月学长
2023/06/09
1.1K0
如何编写代码审查文档
如何看待编写业务代码
业务代码的要求和常规意义上的编程有很多不一样的地方。我们在学习编程的时候往往被教导: 代码要有良好的设计。要抽象和封装,要尽量减少重复代码; 代码要有良好的建模,概念清楚,不同实体的关系清晰; 代码要高效,有O(1)的别用O(log n),有O(log n)的不用O(n); …… 但是到了业务上。这些仿佛就变的不那么重要了。 做业务必须要非常了解业务的动机和业务流程细节。 比如:你可能要做一个下单支付。你要理解下单支付的细节。账户要怎么设计,支付流程要带那些信息,金额有什么限制,撤单怎么撤,怎么打折/用券
大宽宽
2018/06/07
1.2K0
如何编写向前兼容的 Python 代码
对于网络应用来说,目前最安全的做法是仍然坚持使用 Python 2.x,即使是新的项目。一个简单的原因是现在 Python 3 还不支持足够多的库,而将已有的库移植到 Python 3 上是一个巨大的工作。当所有人都在抱怨升级到 Python 3 是如此艰难和痛苦的时候,我们如何才能让这件事变得容易一点呢?
岂不美哉Frost
2019/11/30
1K0
如何更优雅的编写CSS代码
直白的说:编写优秀的 css 代码可能是很痛苦的。很多程序员都不想从事 CSS 开发—我可以做任何事情,除了css以外。
icepy
2019/10/08
1.9K0
如何更优雅的编写CSS代码
如何编写高效的jQuery代码(转载)
1. jQuery速度再快,也无法与原生的javascript方法相比,而且建立的jQuery对象包含的信息量很庞大。所以有原生方法可以使用的场合,尽量避免使用jQuery。
用户1518699
2018/10/11
7550
如何优雅的编写代码(持续更新......)
《编写可读代码的艺术》 《代码整洁之道》 1、如何写出优雅的代码 命名规范 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式,尽量使用完整的英文名,不要嫌弃名字长。 抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以Test结尾。 POJO类中布尔类型的变量,都不要加is前缀,否则部分框架解析会引起序列化错误。 包名统一使用小写,点分隔符之间有
botkenni
2022/03/24
8230
如何编写高质量的代码
Java开发中通用的方法和准则不要在常量和变量中出现易混淆的字母枚举类中不要提供setter三元操作符的类型务必一致避免带有变长参数的方法重载少用静态导入避免为final变量复杂赋值break万万不可忘避免instanceof非预期结果基本类型不要让四舍五入亏了一方提防包装类型的null值谨慎包装类型的大小比较类、对象及方法在接口中不要存在实现代码构造函数尽量简化使用静态内部类提高封装性让工具类不可实例化覆写equals方法时不要识别不出自己推荐覆写toString方法使用package-info类为包服务数组和集合在明确的场景下,为集合指定初始容量避开基本类型数组转换列表陷阱asList方法产生的List对象不可更改子列表只是原列表的一个视图推荐使用subList处理局部列表生成子列表后不要再操作原列表使用Comparator进行排序不推荐使用binarySearch对列表进行检索;集合中的元素必须做到compareTo和equals同步;使用shuffle打乱列表;减少HashMap中元素的数量;多线程使用Vector或HashTable;非稳定排序推荐使用List枚举和注解推荐使用枚举定义常量;使用构造函数协助描述枚举项;小心switch带来的空值异常;在switch的default代码块中增加AssertionError错误;使用valueOf前必须进行校验;枚举项的数量控制在64个以内;小心注解继承;枚举和注解结合使用威力更大;注意@Override不同版本的区别;泛型和反射强制声明泛型的实际类型;不同的场景使用不同的泛型通配符;严格限定泛型类型采用多重界限;注意Class类的特殊性;适时选择getDeclaredXXX和getXXX;反射访问属性或方法是将Accessible设置为true;使用forName动态加载类文件;动态代理可以使代理模式更加灵活;使用反射增加装饰模式的普适性;反射让模板方法模式更强大;不需要太多关注反射效率;异常提倡异常封装;采用异常链传递异常;受检异常尽可能转化为非受检异常;不要在finally块中处理返回值;多使用异常,把性能问题放一边;多线程和并发不推荐覆写start方法;启动线程前stop方法是不可靠的;不适用stop方法停止线程;线程优先级只使用三个等级;使用线程异常处理器提升系统可靠性;volatile不能保证数据同步;异步运算考虑使用Callable接口;优先选择线程池;适时选择不同的线程池来实现;Lock与synchronized是不一样的;预防线程死锁;适当设置阻塞队列长度;使用CountDownLatch协调子线程;CyclicBarrier让多线程齐步走;开源世界大胆采用开源工具;推荐使用Guava扩展工具包;Apache扩展包;推荐使用Joda日期时间扩展包;可以选择多种Collections扩展;思想为源提倡良好的代码风格;不要完全依靠单元测试来发现问题;让注释正确、清晰、简洁;让接口的职责保持单一;增强类的可替换性;依赖抽象而不是实现;抛弃7条不良的编码习惯;以技术人员自律而不是工人
双鬼带单
2020/07/25
1K0
基础|如何优雅的编写JavaScript代码
前端爱好者的知识盛宴 今日 我们要聊一个简单但又不失深奥与思考的问题 进阶成为一名优秀的码农 应该具备哪些基本的素养? 没错 正如上图 作为一名优秀的码农 应具备 码得出代码, 看得懂自己码的代码, 让别人看得懂你码的代码, 这三个基本素养。 提高自身的编码能力和编写易于阅读和维护的代码,是广大码农们提高开发效率和职业身涯中必做的事情。 那么究竟如何编写出可维护的、优雅的代码呢? 避免使用 JS 糟粕和鸡肋 这些年来,随着 HTML5 和 Node.js 的发展,JavaScript 在各个领域遍地开花
用户1097444
2022/06/29
5890
基础|如何优雅的编写JavaScript代码

相似问题

如何编写模块化Android代码

12

如何编写模块化JavaScript代码(库)

116

如何实现可重用和模块化代码的编写

17

如何模块化编写JavaScript?

63

使用Ext编写的代码的模块化和重用

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文