3.3.2 状态机实现
当accept后,进入服务器端状态机。设置accept返回的socket为非阻塞状态。在阻塞的socket上调用send时,如果没有足够的输出缓冲区,该调用将被阻塞。Recv也是一样,要读的数据没有就绪时,调用者阻塞。服务器不知道每次要读取的字节数,所以阻塞的socket无法工作。
分配2块内存:A和B。内存A用来保存recv的内容,内存B用来保存客户端发送的Packet内容。因为服务器不知道客户会发送多大的内容过来,每次从内存A拷贝到内存B之前检查内存B的大小,如果内存B剩余大小不够则重新分配。
在得到了整个Packet后,即GetComplatePacket后,根据dwCallID调用服务器的本地过程,待返回后将返回值和内存打包发送给客户端。
3.4 客户端实现
客户端的流程如图6所示。在Windows下运行,首先调用WSAStartup,Windows根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。然后初始化socket,连接到服务器,接着过程调用。比如过程调用1会进入图4状态机。状态机和服务器端类似,只是首先参数打包,发送给服务器,返回后拆包并拷贝返回信息到内存中。
4 结束语
本文设计和实现的RPC可应用于白盒测试、跨平台开发环境和开发客户端软件等。商用的嵌入式IDE软件都很昂贵,通过本RPC,测试人员就可用开源的环境如cygwin等开发白盒测试代码。另外对于有大量操作界面的嵌入式开发,需要频繁下载到开发板上验证,本文RPC可应用于构建跨平台的开发环境,直接在Windows上开发界面部分,最后下载到开发板上,从而大大提高开发效率。大多数的嵌入式软件都有相应的PC客户端软件,本文的实现也适用于开发PC客户端软件。
本文关键字:嵌入式 嵌入式系统-技术,单片机-工控设备 - 嵌入式系统-技术
上一篇:动态调度算法(DSA)