void CConnectionManager::ProcessNetData()
{
	fd_set fdread;
	fd_set fdwrite;
	struct timeval tv = {0, 0};     
	FD_ZERO(&fdread);  
	FD_ZERO(&fdwrite);
	for (int i = 0; i < m_ConnCount; i++)      
	{     
		FD_SET(m_ConnectionSet[i].GetSocket(), &fdread);   
		FD_SET(m_ConnectionSet[i].GetSocket(), &fdwrite);   
	}     	
	int nRet = select(0, &fdread, &fdwrite, NULL, &tv);  
	if (nRet > 0)      
	{     
		for (int i = 0; i < m_ConnCount; i++)      
		{     
			SOCKET sClient = m_ConnectionSet[i].GetSocket();
			if (FD_ISSET(sClient, &fdread)) //接收数据
			{     
				bool bRet = m_ConnectionSet[i].Recv();     
				if (bRet == false)      
				{     
					LOG_DEBUG("Client socket %d closed.", sClient);     
					closesocket(sClient);   
					ConnCallBack pFuncDelConn = CSocketServer::GetSingleton().GetDelConnFunc();
					if (!pFuncDelConn)
					{
						continue;
					}
					(*pFuncDelConn)(&m_ConnectionSet[i]);
					DelConn(sClient);
					i--;
					continue;
				}      
				else
				{
					ConnCallBack pFuncProcessInput = CSocketServer::GetSingleton().GetProcessInputFunc();
					if (!pFuncProcessInput)
					{
						continue;
					}
					(*pFuncProcessInput)(&m_ConnectionSet[i]);
				}
			} 
			if (FD_ISSET(sClient, &fdwrite))	//发送数据
			{
				bool bRet = m_ConnectionSet[i].FlushSendBuff();     
				if (bRet == false)      
				{     
					LOG_DEBUG("Client socket %d closed.", sClient);     
					closesocket(sClient);   
					ConnCallBack pFuncDelConn = CSocketServer::GetSingleton().GetDelConnFunc();
					if (!pFuncDelConn)
					{
						continue;
					}
					(*pFuncDelConn)(&m_ConnectionSet[i]);
					DelConn(sClient);
					i--;
					continue;
				}      
			}
		}    
	}     
}
Beispiel #2
0
void
CleanUp(int type) {
  if (laddr) {
    LST *temp;
    temp = laddr->next;
    if (laddr->IP)
      free(laddr->IP);
    free(laddr);
    while (temp) {
      LST *t = temp;
      temp = temp->next;
      if (t->IP)
        free(t->IP);
      free(t);
    }
  }
  laddr = NULL;

  if (paddr) {
    PST *temp;
    temp = paddr->next;
    if (paddr->IP)
      free(paddr->IP);
    free(paddr);
    while (temp) {
      PST *t = temp;
      temp = temp->next;
      if (t->IP)
        free(t->IP);
      free(t);
    }
  }
  paddr = NULL;

  if (saddr) {
    SST *temp;
    temp = saddr->next;
    if (saddr->IP)
      free(saddr->IP);
    free(saddr);
    while (temp) {
      SST *t = temp;
      temp = temp->next;
      if (t->IP)
        free(t->IP);
      free(t);
    }
  }
  saddr = NULL;

  if (caddr) {
    CST *temp;
    temp = caddr->next;
    if (caddr->IP)
      free(caddr->IP);
    free(caddr);
    while (temp) {
      CST *t = temp;
      temp = temp->next;
      if (t->IP)
        free(t->IP);
      free(t);
    }
  }
  caddr = NULL;

  if (auser) {
    UST *temp;
    temp = auser->next;
    if (auser->uname)
      free(auser->uname);
    free(auser);
    while (temp) {
      UST *t = temp;
      temp = temp->next;
      if (t->uname)
        free(t->uname);
      free(t);
    }
  }
  auser = NULL;

  while (nconn) {
    if ((nconn->sfd != -1) && (type == 0) && (nconn->type == CT_CLIENT))
      Send(nconn->sfd, "T\n");
    DelConn(nconn->sfd);
  }
  nconn = NULL;
}