我有一个任务,在其中我必须实现几个网络协议。分配包括理想连接上的通信(不丢失或损坏数据)和破坏数据的连接。我想让它尽可能的模块化,但是我想不出怎么做(所有的事情似乎都交织在一起)。以下是我要做的事情清单:
也许我可以实现一种分层架构(受OSI模型的启发),但我不知道如何实现。我需要一个正确的方向。
这些不同的模块应该如何相互交互呢?这样,无论我是否要填充数据链接(滑动窗口),返回-N或选择性重复功能都是独立的,并且在所有这些基础上进行错误检查是透明的。
编辑:的另一个困难是某些协议(回传-N、选择性重复、滑动窗口)需要特定于该协议的状态,而且在C中没有实现有状态函数的好方法。
发布于 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
看起来有点像这样:
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,谢谢”。
由于错误检测必须发生在比这些事情更高的级别上,所以您必须在其他事情之后添加它--添加的时间越晚,它的层越高。
https://stackoverflow.com/questions/15720943
复制相似问题