找论文网 > 计算机论文 > 计算机网络 >

基于IOCP的局域网监控系统(2)

                   shutdown(lpPerIoContext->sClient, SD_BOTH);
                                     closesocket(lpPerIoContext->sClient);
                                     lpPerIoContext->pNext = NULL;
                               pThis->InsertToLookaside(lpPerIoCon text, NULL);
                                     lpHandleContext->pNext = NULL;
                                     pThis->InsertToLookaside(NULL, lpHandleContext);
                                    
                                     pThis->DecreaseClientNum();
                                    
                                     continue;
                            }
                   }
 
                   HANDLE hResult;
                   PPER_HANDLE_CONTEXT lpNewperHandleContext;
//判断该通知为哪种类型的操作的结果
                   switch(lpPerIoContext->IoOperation)
                   {
//接受新的TCP连接
                   case IoAccept:
                            pThis->IncreaseClientNum();
                 EnterCriticalSection(&pThis->m_ ListCriSection);
                         pThis->ReleaseConnectionNode
(lpPerIoContext);
                             LeaveCriticalSection(&pThis-> m_ListCriSection);
//将侦听SOCKET的属性复制给客户端SOCKET, 因为accept 创建的 socket 会自动继承侦听 socket 的属性,而AcceptEx不会
    nResult = setsockopt(
                            lpPerIoContext->sClient,
                               SOL_SOCKET,
                           SO_UPDATE_ACCEPT_CONTEXT,
                               (char *)&pThis->m_ListenSocket,
                           sizeof(pThis->m_ListenSocket)
                               );
                  
if(SOCKET_ERROR == nResult)
                   {
                            pThis->m_strLog.Format("客户(ID=%d) SO_ UPDATE_ACCEPT_CONTEXT 失败:%d",
                            lpPerIoContext->unId, WSAGetLastError());
                Log(pThis->m_strLog);
 
                      closesocket(lpPerIoContext->sClient);     
                      lpPerIoContext->pNext = NULL;
                      pThis->InsertToLookaside(lpPerIoContext, NULL);
 
                            pThis->DecreaseClientNum();
                                    
                            continue;
           }
//为新的SOCKET分配单句柄数据
           lpNewperHandleContext=pThis->GetHandleFrom Lookaside();
           if (NULL == lpNewperHandleContext)
           {
                     lpNewperHandleContext = (PPER_HANDLE_ CONTEXT)HeapAlloc(
                              GetProcessHeap(),
                              HEAP_ZERO_MEMORY,
                              sizeof(PER_HANDLE_CONTEXT)
                              );
                   if (NULL == lpNewperHandleContext)
                   {
                              pThis->m_strLog.Format("HeapAlloc() 失败");
                              Log(pThis->m_strLog);
                                              
                              shutdown(lpPerIoContext->sClient, SD_BOTH);
                              closesocket(lpPerIoContext->sClient);
                              lpPerIoContext->pNext = NULL;
                              pThis->InsertToLookaside(lpPerIoContext, NULL);
 
                               pThis->DecreaseClientNum();
                                              
                                     continue;
                            }                                  
                   }
//将新的SOCKET关联到同一完成端口上
                   lpNewperHandleContext->IoSocket = lpPerIo Context  ->sClient;
                   lpNewperHandleContext->pNext = NULL;
                           
                           
                   hResult = CreateIoCompletionPort(
                                      (HANDLE)lpPerIoContext->sClient,\
                                      pThis->m_hCOP,
 (DWORD_PTR)lpNewperHandleContext,
                                      0
                                      );
                   if (NULL == hResult)
                   {
                            pThis->m_strLog.Format("关联完成端口到客户套接字失败:%d", GetLastError());
                            Log(pThis->m_strLog);
 
                            shutdown(lpPerIoContext->sClient, SD_BOTH);
                            closesocket(lpPerIoContext->sClient);
                            lpPerIoContext->pNext = NULL;
                            lpNewperHandleContext->pNext = NULL;
              pThis->InsertToLookaside(lpPerIoContext, NULL);
                            pThis->InsertToLookaside(NULL, lpNewperHandleContext);
                            pThis->DecreaseClientNum();
                                    
                            continue;
                   }
//接收来自CLIENT的数据
                   if(pThis->HandleData(lpPerIoContext, IO_READ_COMPLETION, dwNumberBytes))
                            pThis->DataAction(lpPerIoContext, lpNewperHandleContext);
 
                   continue;
 
//数据接收完的通知
         case IoRead:
                   if(pThis->HandleData(lpPerIoContext, IO_READ_COMPLETION, dwNumberBytes))
                            pThis->DataAction(lpPerIoContext, lpNewperHandleContext);
                   continue;
//数据发送完的通知
         case IoWrite:
                   if(pThis->HandleData(lpPerIoContext, IO_WRITE_COMPLETION,dwNumberBytes))
                            pThis->DataAction(lpPerIoContext, lpNewperHandleContext);
                   continue;
         default:
                   continue;
         }
}
    数据处理都放在HandleData中实现,数据处理完后的响应代码都在DataAction中实现,在此不做详细介绍。
6 结束语
    编写网络服务器应用程序的难点在于程序的“可扩展性”,即如何开发出大容量且能处理大量并发SocketI/O请求的高性能代理应用程序。IOCP机制通过完成端口对象来对重叠I/O请求进行管理,并且利用多线程来处理重叠I/O操作完成后得到的数据,是一种与Win32 Sockets结合度较高的实现高效率I/O的有效方法。
    本文设计的网络服务器在局域网监控系统中成功使用。实际应用表明:利用IOCP机制实现的网络服务器应用程序能够针对大量的客户请求进行高效处理,在速度和性能上体现出其良好的特征,不失为一种实现网络服务器的有效技术。
参考文献
[1] 张静华,张玉明.IOCP研究及在大规模网络通信系统中的应用. 计算机与现代化,2004,9
[2] 陈和平,周静宁等.IOCP机制与网络代理服务器实现方法.计算机应用,2003,4
[3] Anthony Jones,Jim Ohlund著.Windows网络编程技术.机械工业出版社,2000,(176-206)
[4] 潘爱民,王国印译.Visual C++技术内幕(第四版).清华大学出版社,1999
[5] 官章全,韩云君等.Visual C++6.0高级编程范例.电子工业出版社,2001

共2页: 上一页 [1] 2


池化负载均衡技术在证券网络系统中的研究与实现
一种基于PSO的BP神经网络训练方法
工商管理 | 工科论文 | 财务管理 | 管理学 | 公共管理 | 财政税收 | 证券金融 | 会计审计 | 计算机 | 法律论文 | 医药学 | 汉语言文学
社会论文 | 工科论文 | 理科论文 | 文化论文 | 艺术论文 | 文学论文 | 哲学论文 | 政治论文 | 英语论文 | 写作指导 | 计算机应用
www.zlunwen.com 找论文网 ® 版权所有 网站地图