void SessionProcessPacket( CapEnv* env, DSSL_Pkt* pkt ) { uint32_t code; TcpStream* stream = NULL; int rc = DSSL_RC_OK; int dir = 0; _ASSERT( pkt ); _ASSERT( pkt->session ); if( !SessionDecodable( pkt->session ) ) return; code = PreProcessPacket( pkt ); dir = code & SES_PACKET_DIR_MASK; switch( dir ) { case ePacketDirFromClient: stream = &pkt->session->clientStream; break; case ePacketDirFromServer: stream = &pkt->session->serverStream; break; default: _ASSERT( FALSE ); /* this packet does not belong to this session? */ return; } rc = StreamProcessPacket( stream, pkt ); if( pkt->session->closing ) code |= SES_ACTION_CLOSE; if( rc != DSSL_RC_OK ) { SessionOnError( pkt->session, rc ); code |= SES_ACTION_CLOSE; } pkt->session->lastPacketDirection = dir; if( code & SES_ACTION_CLOSE ) { env->sessions->DestroySession( env->sessions, pkt->session ); } }
unsigned int CReceiver::Run() { if( NULL == m_pSocket ) return -1; fd_set fds; FD_ZERO( &fds ); timeval tVal; tVal.tv_sec = 0; tVal.tv_usec = 0; while(!m_bEndThread) { if(m_LockCritical.Lock()) { DWORD dwWaitRet = 0; DWORD dwWaitStart = 0; DWORD dwWaitEnd = 0; DWORD dwWaitDelta = 0; ///Test End.. if( NONE_CYCLE != m_dwReceiverCycleTime ) { dwWaitStart = m_pTimeStamp->GetTimeCount(); dwWaitRet = ::WSAWaitForMultipleEvents(1, &m_hSocketEvent, FALSE, m_dwSockEventWaitTime, FALSE); } else { dwWaitRet = ::WSAWaitForMultipleEvents(1, &m_hSocketEvent, FALSE, WSA_INFINITE, FALSE); } if( TRUE == m_bEndThread || NULL == m_pSocket || INVALID_SOCKET == m_pSocket->GetHandle() ) { m_bEndThread = TRUE; m_LockCritical.Unlock(); break; } if( WSA_WAIT_TIMEOUT == dwWaitRet ) { m_dwSockEventWaitTime = m_dwReceiverCycleTime; m_LockCritical.Unlock(); continue; } else if( WSA_WAIT_EVENT_0 == dwWaitRet ) { WSANETWORKEVENTS NetWorkEvent; memset(&NetWorkEvent, 0, sizeof(WSANETWORKEVENTS)); if (::WSAEnumNetworkEvents(m_pSocket->GetHandle(), m_hSocketEvent, &NetWorkEvent) == 0) { ::WSAResetEvent(m_hSocketEvent); // Check event this order, FD_READ if ( FD_READ == (NetWorkEvent.lNetworkEvents & FD_READ) && 0 == NetWorkEvent.iErrorCode[FD_READ_BIT] ) { if(!PreProcessPacket()) { switch(WSAGetLastError()) { case WSANOTINITIALISED: break;//TRACE("\n"); break; case WSAENETDOWN: break;//TRACE("\n"); break; case WSAEFAULT: break;//TRACE("\n"); break; case WSAEINTR: break;//TRACE("\n"); break; case WSAEINPROGRESS: break;//TRACE("\n"); break; case WSAEINVAL: break;//TRACE("\n"); break; case WSAEISCONN: break;//TRACE("\n"); break; case WSAENETRESET: break;//TRACE("\n"); break; case WSAENOTCONN: break;//TRACE("\n"); break; case WSAEOPNOTSUPP: break;//TRACE("\n"); break; case WSAESHUTDOWN: break;//TRACE("\n"); break; case WSAEWOULDBLOCK: break;//TRACE("\n"); break; case WSAEMSGSIZE: break;//TRACE("\n"); break; case WSAECONNRESET: break;//TRACE("\n"); break; case WSAEDISCON: break;//TRACE("\n"); break; case WSA_IO_PENDING: break;//TRACE("\n"); break; case WSA_OPERATION_ABORTED: break;//TRACE("\n"); break; } } } } } else if( WSA_WAIT_FAILED == dwWaitRet ) { switch ( WSAGetLastError() ) { case WSANOTINITIALISED : break;//TRACE("WSANOTINITIALISED \n"); break; case WSAENETDOWN : break;//TRACE("WSAENETDOWN \n"); break; case WSAEACCES : break;//TRACE("WSAEACCES \n"); break; case WSAEINTR : break;//TRACE("WSAEINTR \n"); break; case WSAEINPROGRESS : break;//TRACE("WSAEINPROGRESS \n"); break; case WSAEFAULT : break;//TRACE("WSAEFAULT \n"); break; case WSAENETRESET : break;//TRACE("WSAENETRESET \n"); break; case WSAENOBUFS : break;//TRACE("WSAENOBUFS \n"); break; case WSAENOTCONN : break;//TRACE("WSAENOTCONN \n"); break; case WSAENOTSOCK : break;//TRACE("WSAENOTSOCK \n"); break; case WSAEOPNOTSUPP : break;//TRACE("WSAEOPNOTSUPP \n"); break; case WSAESHUTDOWN : break;//TRACE("WSAESHUTDOWN \n"); break; case WSAEWOULDBLOCK : break;//TRACE("WSAEWOULDBLOCK \n"); break; case WSAEMSGSIZE : break;//TRACE("WSAEMSGSIZE \n"); break; case WSAEHOSTUNREACH : break;//TRACE("WSAEHOSTUNREACH \n"); break; case WSAEINVAL : break;//TRACE("WSAEINVAL \n"); break; case WSAECONNABORTED : break;//TRACE("WSAECONNABORTED \n"); break; case WSAECONNRESET : break;//TRACE("WSAECONNRESET \n"); break; case WSAETIMEDOUT : break;//TRACE("WSAETIMEDOUT \n"); break; default : break;//TRACE("Unknown Error. \n"); } } /////////////////////////////// if( NONE_CYCLE != m_dwReceiverCycleTime ) { dwWaitEnd = m_pTimeStamp->GetTimeCount(); dwWaitDelta = dwWaitEnd - dwWaitStart; if( dwWaitDelta > m_dwReceiverCycleTime ) { m_dwSockEventWaitTime = 0; } else { m_dwSockEventWaitTime = m_dwReceiverCycleTime - dwWaitDelta; } } m_LockCritical.Unlock(); } } return 0; }