最近,根据项目需求,需要实现一个工业控制管理系统。该管理系统需要去连接大量的用于工业控制的下位机。下位机作为TCP服务端,开放一个固定的端口,等待管理系统的连接(下位机的这种网络模式不可更改)。管理系统需要连接并管理好这些下位机,实时与下位机进行数据通信。该项目的难点在于下位机的数量很多(少则数百,多则数千)。
管理系统作为TCP连接的客户端,主动去与下位机(服务端)建立连接。对于每一个下位机, 管理系统(客户端)都需要new一个socket,与服务端的建立连接,连接成功后,管理系统需要保存好这个socket,以便需要时进行通信(如果不保存这个socket,每次通信时都需要先建立TCP连接,那么实时性会大打折扣)。假设有两千个下位机,管理系统就需要维护两千个socket,那么如何维护好这么多的socket呢?对每条连接都建立一个线程?下位机的数量是个位数的情况下还算凑合,两千个线程?开什么玩笑,就算你同意计算机也不会同意的。
如果管理系统作为服务端,开放某个TCP端口,下位机作为客户端,主动与服务端建立连接,那么,这就是传统的C/S模式,开发这种系统对于初学者也应该是小菜一碟。在传统的C/S模式下,服务端管理着大量的socket,每个socket对应着一个客户端。常见的网络模型有select模型,但这种模型管理的socket数量有限制,不超过1024个,而且在socket较多时,基于轮询机制select模型会力不从心,这时就可以用大名鼎鼎的ICOP模型了。可是,该项目中的下位机只能作为服务端,管理系统只能作为客户端,ICOP模型还能排上用场吗?答案是:可以!
如果对ICOP的机制比较精通的话,就会发现,和完成端口绑定的socket并没有区分socket是服务端的还是客户端的,只要把一个socket绑定到完成端口上,在这个socket上投递recv操作即可接收网络数据。这就是我在研究透IOCP机制的基础上找到的思路。
各位大侠还有什么更好的解决方案,可以给我留言。需要源码的朋友,这里不方便提供(项目太大),但我可以提供关键步骤的代码,建议深入研究一下IOCP的工作机制,否则可能无处下手。QQ:459238972