摘要:利用Windows提供的完成端口(IOCP)模型,实现C/S模式下远程屏幕监控服务器同时对大量并发客户进行屏幕监控的功能,可以根据需要决定是否开始远程控制。用IOCP对多线程进行调度和管理,高效地利用系统资源。并且给出了整个系统的网络设计与实现过程。
关键字:IOCP;多线程;远程屏幕监控
1 远程屏幕监控系统的总体结构
在Windows系统中,对于大型的服务器应用一般设计为C/S模式,通过在客户端和服务器之间建立网络连接来实现信息的传输。对于服务器来说,在同一时间可能需要监控多个客户端屏幕,在远程屏幕监控系统的大致结构如图1所示。
由被监控的客户端捕捉屏幕图像,经过压缩之后实时地传输给服务器,服务器打开一个窗口,并将收到的客户端屏幕图像数据显示在该窗口中,如需对客户端进行控制,则服务器端将该窗口中捕捉到的鼠标键盘消息发送到客户端,客户端收到此消息后模拟出鼠标键盘点击事件,实现远程控制。采用IOCP机制,只需要为数不多的几个线程就同时为多个客户端提供服务,并且效率远高于其它网络模型。
2 IOCP机制的基本原理
IOCP是性能最好的一种I/O模型。它是应用程序使用线程池处理异步I/O请求的一种机制。在处理多个并发的异步I/O请求时,以往的模型都是在接收请求时创建一个线程来应答请求。这样就有很多的线程并行地运行在系统中。而这些线程都是可运行的,Windows内核花费大量的时间在进行线程的上下文切换,并没有多少时间花在线程运行上。再加上创建新线程的开销比较大,所以造成了效率的低下。
IOCP的目标是实现高效的服务器程序,它克服了一般并发模型的不足,其方法是在初始化完成端口的时候创建一定数量的服务线程。当系统完成I/O *** 作之后,向服务器完成端口发送I/O compleTIon packet,此时线程池中的线程在完成端口上排队等待I/O *** 作的完成。如果在完成端口上没有收到I/O compleTIon packet,这些线程处于睡眠状态。否则,这些线程按照后进先出(LIFO)的方式被唤醒,并完成后续数据处理 *** 作。
3 服务器设计
远程屏幕监控服务器的核心功能是将接收到的客户端的屏幕图像显示到一个服务器端窗口中,服务器通过此窗口对客户端进行远程控制。为了提高系统可靠性,网络协议采用面向连接的TCP协议,利用TCP协议中的拥塞避免以及超时和差错重传机制可以确保数据在传输的可靠性。
3.1 服务器监听套接字的实现
在服务器端建立IOCP模型时,首先需要建立一个监听套接字,对于监听套接字,并不将它与完成端口相关联,而是调用WSAEventSelect为监听套接字注册FD_ACCEPT网络事件。该函数的声明如下:
之后创建一个监听线程,在此线程中可以循环调用WSAWaitForMulTIpleEvents等待事件对象被触发。在该函数正确返回之后,继续调用WSAEnumNetworkEvents函数列举出发生在套接字上的事件,如果是FD_ACCEPT事件,则接受该连接,并将新建的套接字与创建的完成端口相关联,并在此套接字上调用WSARecv投递接收数据的请求。
3.2 IOCP模型的实现
要建立IOCP模型,需要在服务器启动监听线程时,首先创建一个完成端口对象,通过调用CreateIoCompleTIonPort来实现,之后调用GetSystemlnfo函数获得CPU的数量,根据CPU的数量创建一定数量的服务线程在此端口上等待完成事件的通知,一般来说,服务线程的数量大约是CPU数量的2倍。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)