C 与使用返回值的调用方相比,事件驱动

C 与使用返回值的调用方相比,事件驱动,c,events,event-driven,C,Events,Event Driven,我有一个用C写的程序,我正在考虑如何设计它的一部分 这里没有C++,现有代码是C,所以这部分也必须是C.< 基本上,我有一个文件,它可以分割并合并部分数据以进行传输。我只是在处理代码的接收部分 它的工作原理如下: 如果您发送的数据由于足够小(但调用者还不知道这一点)而没有被拆分,那么函数只会返回可用的数据,以便调用者可以调用GetData() 但是,如果发送一个数据块,函数将返回部分_数据包,调用者必须一直发送数据,直到函数返回可用的数据_,因此调用者可以调用GetData()来获取完全重新组装

我有一个用C写的程序,我正在考虑如何设计它的一部分

这里没有C++,现有代码是C,所以这部分也必须是C.< 基本上,我有一个文件,它可以分割并合并部分数据以进行传输。我只是在处理代码的接收部分

它的工作原理如下: 如果您发送的数据由于足够小(但调用者还不知道这一点)而没有被拆分,那么函数只会返回可用的数据,以便调用者可以调用GetData()

但是,如果发送一个数据块,函数将返回部分_数据包,调用者必须一直发送数据,直到函数返回可用的数据_,因此调用者可以调用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_FetchNextPackage()”以获取下一个完整数据包(此时,它将从环形缓冲区中删除)

信号方法 更详细的实现可能是使用系统信号(如USR1信号)向调用者发出完整数据包准备就绪的信号。调用方将收到来自调用方实现的信号处理程序的完整数据包完全到达的警报

信号量方法 也许您的代码可以向客户机提供一个信号量,客户机可以使用该信号量“睡眠”,直到完整的数据包到达


可能会使用更多的方法,包括某种消息队列实现。无论设计如何,架构最重要的输入可能是“调用者最容易做的事情”。为了更全面地回答您的问题,需要更详细地了解来电者的需求

你的问题让我有点困惑。我收集到有一个“数据传输”通信端点,也有一个“数据接收”通信端点;传输端可以发送“小的整体”数据包或“较大的分解”数据包;您正在处理接收端点。而且,您的代码是在“调用者”和原始接收端点之间分层的。代码的目的是为调用者提供一个更简单的通信接口。到目前为止我说的对吗?是的,调用方获取一些原始数据,将其传递给另一个文件中的函数进行处理,然后我想知道该文件如何通过返回结果代码或调用某个函数/触发事件来表示“我从您提供给我的数据中获得了一个有效、完整的数据包”。