分享到:
计算机网络 最近更新
讨论未来电商发展趋势论文提纲
浅谈自媒体对现代生活的影响
论文范文:网络发展对青少年心理发展的影响
论我国电子商务应用中的支付问题
电子商务模式研究
中小型企业客户关系管理系统的开发与应用
中石油浙江销售分公司信息管理系统设计
图书馆管理系统分析与设计
物流师职业资格认证报名管理系统
销售管理系统的开发与设计
酒店客房管理系统
财务管理系统的实现
餐饮管理系统设计与实现
社区卫生服务管理系统
汽车营销企业的客户关系管理系统
明道管理咨询有限公司客户关系管理系统设计与开发
企业订单管理系统开发
基于WEB的CRM信息系统的开发与研究
高校科研工作量统计系统的开发与设计
基于Struts的连锁店管理系统
基于IOCP的局域网监控系统
摘 要 本文介绍了一种在WINDOWS平台上比较成熟的I/O方法---完成端口,提出了通过使用IOCP机制和旁视列表技术建立网络服务器模型的方法,实现了利用为数不多的线程为成千上万的客户同时提供网络服务,解决了大多数网络服务器连接大量客户端和处理大量数据时存在的问题,获得了极好的性能和强大的扩展能力。文章给出了基于Windows 2000平台的局域网监控系统中网络服务器的设计与实现过程。
    关键词 完成端口;旁视列表;网络服务器;VC++
 
1  引言
    在局域网远程监控系统中,网络管理中心需要同时监控每个客户端计算机的运行情况,将远程监控画面显示在管理中心的电脑屏幕上。网络服务器要求实现定时截获客户端计算机上的屏幕数据与正在运行程序的数据,定时截取客户端屏幕图像,并将截获的数据和图像保存在数据库中等功能。在较大型局域网中有几百上千个客户端,需要对大量的客户端数据进行处理。因此如何让网络服务器同时为多个客户端服务,但又不丧失整体的性能成为开发的难点。本文采用了I/O完成端口、旁视列表等技术,设计了一种高效的网络服务器,让此问题得到了有效的解决。
2  IOCP机制
    IOCP(I/O Completion Port输入/输出完成端口)是一种能够合理利用与管理多线程的机制。该机制使用完成端口,用一定数量的线程处理重叠I/O(Overlapped I/O)的技术,帮助处理大量客户端请求的网络服务问题,特别适合于开发网络服务器一类的应用程序,并可使系统的性能达到较佳状态。IOCP模型图如图1所示。

图1 完成端口工作模式
    完成端口模式要求创建一个Win32完成端口对象来对重叠I/O请求进行管理,并通过创建一定数量的工作者线程(WorkThread),来为已经完成的重叠I/O请求提供服务。其实,可以把完成端口看成系统维护的一个队列,操作系统把重叠I/O操作完成的事件通知放入该队列,由于是“操作完成”的事件通知,故取名为“完成端口”。一个完成端口被创建以后,可以和多个文件句柄进行关联(文件句柄可以是真正的文件句柄,也可以是Socket句柄或命名管道),并在关联后的句柄上进行重叠I/O操作。当I/O操作完成后,一个重叠I/O完成的事件通知就会被排在此端口的完成队列上,此时,某个工作者线程将会被唤醒来为完成端口服务,执行特定的处理工作。一般来说,一个应用程序可以创建多个工作者线程来处理完成端口上的通知事件,工作者线程的数量依赖于程序的具体需要。 
3  数据库同步机制实现过程: (系统结构图如图2)
图2 系统结构图
    (1)整体系统安装初始,各个同步端的数据库初始化为一致。
    (2)数据服务器维护各个同步端的SQL队列,不断检查是否有操作项,然后将各项操作依序发送至各个在线的同步端。
    (3)在线同步端收到后,置入SQL队列,将SQL队列按操作发生时间先后排序
    (4)在线同步端将SQL队列中的各项操作依序执行并通知服务器执行的结果。服务器收到后将该项操作从该同步端的SQL队列中删除。
    (5)某一在线同步端执行非读的SQL操作后,向服务器发送该操作,服务器将该操作放入除了此同步端外的其他同步端的SQL队列中,并放入历史SQL文件,然后转到第2步
    (6)有新同步端注册入系统后,将从数据服务器(数据服务器同时建立该同步端的SQL队列)下载历史SQL文件,并执行其中各项操作。
    (7)某同步端选择注销,数据服务器删除该同步端的SQL队列。
4  内存分配机制
    在该系统中内存的分配和释放比较频繁,为了比较高效分配释放数据,采用一种称作Lookaside List(旁视列表)的数据结构。在该系统中用于单句柄数据和重叠操作数据(完成键)的分配和释放。Lookaside List的原理是在分配一块数据空间前,先查看回收链表中是否有数据空间指针,如果有则不需要调用系统的内存分配,直接使用回收链表中的该指针指向的数据空间,并将回收链表中该指针节点移除,当使用完数据空间后,也不必调系统的内存释放,而将该数据空间指针移入回收链表。在进程最终结束后才将回收链表中的所有指针指向的数据空间释放。从而大大减低程序在运行期的频繁内存分配和释放产生的开销。
5  实现过程 5.1 初始化
    读取服务器配置文件,初始化客户端连接链表;建立完成端口,根据CPU个数建立等待和接受完成通知的线程;初始化WinSock接口,建立侦听SOCKET;取扩展函数AcceptEx;关联完成端口到侦听SOCKET;绑定和侦听。
5.2 启动服务
    (1)建立网络事件、设置该网络事件为侦听SOCKET的ACCEPT网络事件,这样当AcceptEx一次性分配的N个预备SOCKET由于满足不断上来的TCP连接而耗尽,并有新的TCP连接请求时,就会触发侦听SOCKET的ACCEPT事件,服务器就会在这个时机调用AcceptEx再次分配N个新的预备SOCKET以满足新的TCP连接请求。在该系统中,N=10。
    (2)分配的N个预备SOCKET
    (3)建立检查和分配线程,该线程作用:等待ACCEPT网络事件以分配新的预备SOCKET;定时检测和挂断未收发任何数据且超时连接的TCP连接,防止DoS(拒绝服务)攻击。
5.3完成通知线程内部处理
while (TRUE)
         {
//等待完成端口的通知
                   bSuccess = GetQueuedCompletionStatus(
                                                                                                       pThis->m_hCOP,
                                                                                                       &dwNumberBytes,
                                                                                                       (PULONG_PTR )&lpHandleContext,
                                                                                                       &lpOverlapped,
                                                                                                       INFINITE
                                                                                                       );
 
                   if (!bSuccess)
                   {
pThis->m_strLog.Format("GetQueuedCompletionStatus() 失败:%d", GetLastError());
                            Log(pThis->m_strLog);
 
                            PPER_IO_CONTEXT lpPerIoContext = (PPER _IO_CONTEXT)lpOverlapped;
                            lpPerIoContext->pNext = NULL;
                            pThis->InsertToLookaside(lpPerIoContext, NULL);
                            lpHandleContext->pNext = NULL;
                            pThis->InsertToLookaside(NULL, lpHandleContext);
 
                            continue;
                   }
//如果外部发送空的单句柄数据指针,则退出完成通知线程
                   if (NULL == lpHandleContext)
                   {      
                            return 0;
                   }
//将完成键转换为自己格式的数据指针
                   PPER_IO_CONTEXT lpPerIoContext = (PPER_IO_ CONTEXT)lpOverlapped;
//这种情况表示客户端自己挂断连接
                   if(IoAccept != lpPerIoContext->IoOperation)
                   {
 
                            if(0 == dwNumberBytes)
                            {
                  
随机推荐
智能的交换式IP骨干网解决方案
网络性能测量技术的研究
论网络对社会的正负效应
使用JAVA编写网络通信程序
网络课程的功能结构及教学模式初探
企业局域网的组建与网站建设
无线网状网络的路由协议研究
网络道德失范问题、原因与对策分析
网络“知沟”及其与传统媒体环境下 “知沟”的对比研究
网络隐私权现行概况与其保护措施

设为首页 | 关于我们 | 广告联系 | 友情链接 | 版权申明

Copyright 2009-2014 All Right Reserved [粤ICP备05100058号-11]