大家都来说两句:server端网络通讯模块封装成dll,可行吗?该如何处理

大家都来说两句:server端网络通讯模块封装成dll,可行吗?

            我们现在要做个网络通讯程序,server端是pc,客户端是硬件设备,以太网连接,tcp协议进行通讯。客户端的设备可能有几百台。我主要做server端软件。socket方式进行通讯。我想把server端的和设备进行通讯的模块封装成dll,把设备发上来的数据提供给用户,以进行编程处理业务逻辑。这个dll也要完成客户下发的各种命令数据,以调用我的dll中的函数来完成。

        我觉得具体做起来比较困难,即使提供给客户,在真正使用过程中,也会有很多问题:接收多连接数时的稳定性,各种异常情况时的处理、事件实时响应,还有就是用户以什么方式调用我的接收函数,开多线程?用dll来封装server   socket完成所有处理好像不现实,也很难做到独立,对调用者来说处理也不灵活,请问大家的看法怎样?急待指点!


------解决方案--------------------
可以啊。
向dll传回调函数,dll接收到数据后,通过回调函数传给应用程序
------解决方案--------------------
除了“独立”之外的所有问题,你不封装也会遇到。至于独立性,其实不难。多想想设计模式
一个著名的例子就是IConnectionPoint

可以说,实现这个本身并不是不可行的,但是对设计者的设计技能有很高的要求
------解决方案--------------------
应该可以用DLL
------解决方案--------------------
两种方式,一种是DLL带缓冲的,也就是收数据可以随时读取,由DLL来主动接收数据并缓存;一种是DLL不带缓冲的,需要应用及时收取数据并处理。

仅举一个DLL不带缓冲的例子:
DLL接口设计成
BOOL fnCreateServer(DWORD dwServerID, WORD wPort, HANDLE** ppRecvEvent);
BOOL fnDeleteServer(DWORD dwServerID);
BOOL fnGetServerInfo(DWORD dwServerID, DWORD* pClientNum);
BOOL fnGetClientInfo(DWORD dwServerID, DWORD dwClientID, DWORD* pIP, WORD* pPort);
BOOL fnSend(DWORD dwServerID, DWORD dwClientID, LPCTSTR lpcszSend, WORD wLen);
BOOL fnRecv(DWORD dwServerID, DWORD dwClientID, LPTSTR lpszRecv, WORD wLen);

DLL里面创建一个消息队列,为每个TCPServer定义一个消息值(用于Accept、Receive和Close),维护一个TCPServer信息链表(包括ServerID、所用端口),为每个TCPServer维护一个TCPClient信息链表(包括ServerID、远端端口、远端IP),创建一个消息回调函数,等待并处理消息,其后通过应用传过来的ppRecvEvent通知应用有数据需要读取。

应用里面为每个TCPServer创建一个HANDLE hEvent[64]来WaitForMultipleObjects这些接收数据事件。通过fnCreateServer来创建TCPServer,fnDeleteServer来删除TCPServer,fnGetServerInfo来获取指定TCPServer的Client连接数,fnGetClientInfo来获取指定TCPServer的Client的信息,fnSend发送数据到指定TCPServer的指定Client,fnRecv接收数据从指定TCPServer的指定Client。