我有一个用 C 语言编写的程序,我正在考虑如何设计其中的一部分。
这里没有C++,现有代码是C,所以这部分也必须是C。
基本上,我有一个文件可以拆分和组合部分数据以进行传输。我只是在处理代码的接收部分。
它的工作原理是这样的: 如果您向它发送的数据由于足够小而未拆分(但调用者尚不知道),该函数只会返回 DATA_AVAILABLE,以便调用者可以调用 GetData()
但是,如果您发送一大块数据,该函数将返回 PARTIAL_PACKET,并且调用者必须继续发送数据直到函数返回 DATA_AVAILABLE,因此调用者可以调用 GetData() 来获取完全重组的数据。
问题:这是最好的方法吗,还是我应该应用某种事件系统。例如。调用者执行类似“SetOnDataReceived(&processData)”的操作,然后将数据提供给函数,而不关心结果代码,因为知道一旦收到有效数据就会调用函数“processData”。
最佳答案
也许您可以实现一个线程来维护“环形缓冲区”。该线程将监听传入的数据,并将数据存储在缓冲区中。该线程还可以解析接收到的数据以描述每个数据包何时被完全接收。
然后,也许您的代码可以为调用者提供一套功能。如:
/* Initialize your ring-buffer, and start listening for packets, etc. */
int STEVE_Initialize();
/* Returns the number of fully recieved packets ready for processing. */
int STEVE_PacketsReadyCount();
/* Read a full packet from the ring-buffer and return it to the caller. */
int STEVE_FetchNextPacket();
/* Stop listening for packets, free ring-buffer, etc. */
int STEVE_Terminate();
轮询方法 给定这样的实现,调用者可以使用“Steve_PacketsReadyCount()”来实现轮询循环。当数据包准备就绪时,调用者将调用“STEVE_FetchNextPacket()”以获取下一个完整数据包(此时,它将从环形缓冲区中删除)。
信号法 更精细的实现可能是使用系统信号,例如 USR1 信号,向调用者发出一个完整数据包已准备就绪的信号。调用者将收到来自调用者实现的信号处理程序的完整数据包的完整到达的警报。
信号量方法 也许您的代码可以向客户端提供一个信号量,客户端可以使用该信号量“休眠”直到完整的数据包到达。
还有很多方法可以使用,包括某种消息队列实现。不管它是如何设计的,也许对架构最重要的输入是“对调用者来说最简单的”。为了更全面地回答您的问题,需要更详细地了解来电者的需求。
关于c - 事件驱动与使用返回值的调用者相比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23315508/