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

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

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

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

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

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-30 20: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
运行
复制
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

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档