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 );
	}
}
Esempio n. 2
0
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;	
}