于完成端口的数据接收问题

DWORD   __stdcall       CompletionRoutine(LPVOID   Param)  
  {  
  CompletionPortModel*   pCP   =   (CompletionPortModel*)Param;  
  DWORD   dwNumberBytes;  
  PPER_HANDLE_CONTEXT   lpHandleContext   =   NULL;  
  LPWSAOVERLAPPED   lpOverlapped   =   NULL;  
  int   nResult;  
  BOOL   bSuccess;  
  EnterCriticalSection(&pCP->m_CPCriSection);  
  ++   pCP->CPThreadCount;  
  LeaveCriticalSection(&pCP->m_CPCriSection);  
  TRACE("第%d个完成端口处理线程启动。/n",pCP->CPThreadCount);  
   
  while   (pCP->CPThreadRun   ==   1)  
  {  
  bSuccess   =   GetQueuedCompletionStatus(pCP->m_hCOP,&dwNumberBytes,(PULONG_PTR   )&lpHandleContext,&lpOverlapped,1000);//INFINITE);  
   
  PPER_IO_CONTEXT   lpPerIoContext   =   (PPER_IO_CONTEXT)lpOverlapped;  
  if   (FALSE   ==   bSuccess   &&   pCP->CPThreadRun   ==   1)  
  {  
   
  #ifndef   _DEBUG  
  TRACE(   "GetQueuedCompletionStatus()   failed:   %d"   ,   GetLastError());  
  #endif  
  if   (lpPerIoContext)  
  {  
  pCP->ReleaseClient(lpPerIoContext);  
   
  pCP->InsertToLookaside(lpPerIoContext,   NULL);  
  }  
  if   (lpHandleContext)  
  {  
  lpHandleContext->pNext   =   NULL;  
  pCP->InsertToLookaside(NULL,   lpHandleContext);  
  }  
   
  continue;  
  }  
  if   (pCP->CPThreadRun   ==   1)  
  {  
  if   (NULL   ==   lpHandleContext)  
  {  
  //  
  //PostQueuedCompletionStatus发过来一个空的单句柄数据,表示线程要退出了。  
  //  
  TRACE("第%d个完成端口处理线程退出:PostQueuedCompletionStatus发过来一个空的单句柄数据,表示线程要退出了/n",pCP->CPThreadCount);  
  --pCP->CPThreadCount;  
  return   0;  
  }  
   
   
  #ifdef   _DEBUG  
  // TRACE(   "recv   buffer   data:   %s   %d/n",   lpPerIoContext->szBuffer,lpPerIoContext->dataLen);  
  #endif  
   
  if(IoAccept   !=   lpPerIoContext->IoOperation   &&   0   ==   dwNumberBytes)//非连接消息且收发数据长度为0,则关闭连接  
  {  
  pCP->OnClientClose(lpPerIoContext->unId);  
  pCP->ReleaseClient(lpPerIoContext);  
  pCP->InsertToLookaside(lpPerIoContext,   NULL);  
   
  lpHandleContext->pNext   =   NULL;  
  pCP->InsertToLookaside(NULL,   lpHandleContext);  
   
  continue;  
  }  
   
  HANDLE   hResult;  
  PPER_HANDLE_CONTEXT   lpNewperHandleContext   =   NULL;  
   
  switch(lpPerIoContext->IoOperation)  
  {  
  case   IoAccept   :    
  if   (dwNumberBytes   >   0)  
  {  
  //  
  //第一次连接成功并且收到了数据,将这个结点从链表中解除  
  //  
  EnterCriticalSection(&pCP->m_ListCriSection);  
  pCP->ReleaseNode(lpPerIoContext);  
  LeaveCriticalSection(&pCP->m_ListCriSection);  
  }  
  //将客户连接和服务器监听连接关联,即在客户连接中设置服务器监听连接  
  nResult   =   setsockopt(lpPerIoContext->sClient,    
  SOL_SOCKET,  
  SO_UPDATE_ACCEPT_CONTEXT,  
  (char   *)&pCP->m_ListenSocket,  
  sizeof(pCP->m_ListenSocket)  
  );  
  if(SOCKET_ERROR   ==   nResult)    
  {  
  TRACE(   "SO_UPDATE_ACCEPT_CONTEXT   failed   to   update   accept   socket/n"   );  
  pCP->ReleaseClient(lpPerIoContext);  
  pCP->InsertToLookaside(lpPerIoContext,   NULL);  
   
  continue;  
  }  
   
  //获取一个空闲的节点  
  lpNewper
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值