www.pudn.com > 221315556.rar > SocketEvent.cpp


 
#include "socketevent.h" 
//#ifdef FD_CLR 
//#undef FD_CLR 
//#define FD_CLR() 
//#endif 
CSocketEvent::CSocketEvent(void) 
{ 
	memset( (void*)m_Fdsets, 0, sizeof( __fd_set ) * FDSETCOUNT ); 
	memset( (void*)m_ReadFds, 0, sizeof( __fd_set ) * FDSETCOUNT ); 
	m_Count = 0; 
} 
 
CSocketEvent::~CSocketEvent(void) 
{ 
} 
 
UINT CSocketEvent::Add(SOCKET s, UINT flag) 
{ 
	register int i = 0; 
	for( i = 0;i < FDSETCOUNT;i ++ ) 
	{ 
		if( m_Fdsets[i].fd_count < FD_SETSIZE ) 
		{ 
			FD_SET( s, &m_Fdsets[i] ); 
			//m_SocketHash.HAdd( (int)s, (int)flag ); 
			if( m_Fdsets[i].fd_array[m_Fdsets[i].fd_count-1]==0) 
				GetTickCount(); 
			m_Count ++; 
			return (UINT)i; 
		} 
	} 
	return 0xffffffff; 
} 
 
BOOL CSocketEvent::Del(SOCKET s, UINT id) 
{ 
	if( id >= FDSETCOUNT ) 
		return FALSE; 
	UINT	i = 0; 
	__fd_set	* ptemp = &m_Fdsets[id]; 
	UINT	size; 
	for( i = 0;i < ptemp->fd_count;i++) 
	{ 
	 
		if(ptemp->fd_array[i] == s) 
		{ 
			size = (ptemp->fd_count - i-1) * sizeof( SOCKET); 
			if( size > 0) 
			{ 
				memcpy((void*)m_fds,  (void*)&ptemp->fd_array[i+1],size ); 
				memcpy((void*)&ptemp->fd_array[i], (void*)m_fds, size ); 
			} 
			ptemp->fd_count --; 
			m_Count --; 
			return TRUE; 
		} 
	} 
	return FALSE; 
} 
 
BOOL CSocketEvent::CanRead(SOCKET s, UINT id) 
{ 
	if( id >= FDSETCOUNT ) 
		return FALSE; 
	if( FD_ISSET( s, &m_ReadFds[id] ) == 0 ) 
		return FALSE; 
	return TRUE; 
} 
 
 
 
 
 
UINT CSocketEvent::GetReadSocket(SOCKET* sBuffer, UINT* iBuffer) 
{ 
	UINT i = 0; 
	int i2 = 0; 
	int i1 = 0; 
	if( m_Count == 0 ) 
		return 0; 
	for( i2 = 0;i2 < FDSETCOUNT;i2++) 
	{ 
		if( m_ReadFds[i2].fd_count > 0 ) 
		{ 
			memcpy( &sBuffer[i], (void*)m_ReadFds[i2].fd_array, sizeof( SOCKET ) * m_ReadFds[i2].fd_count ); 
			i += m_ReadFds[i2].fd_count; 
		} 
	} 
	//if( i > 0 ) 
	//	printf( "Get %d read fds\n", i ); 
	return i; 
} 
 
 
VOID CSocketEvent::UpdateRead(void) 
{ 
	UINT	i = 0; 
	timeval tv; 
	if( m_Count == 0 ) 
		return ; 
	tv.tv_sec = 0; 
	tv.tv_usec = 20; 
	int	iread; 
	for( i = 0;i < FDSETCOUNT;i ++ ) 
	{ 
		if( m_Fdsets[i].fd_count > 0 ) 
		{ 
			memcpy( (void*)&m_ReadFds[i], (void*)&m_Fdsets[i], sizeof( __fd_set )); 
			iread = select( FD_SETSIZE, (fd_set*)&m_ReadFds[i], 0, 0, &tv ); 
			if( iread < 0) 
				memset( &m_ReadFds[i], 0, sizeof( __fd_set)); 
			//if( iread > 0 ) 
			//	printf( "Read Select return %d\n", iread ); 
		} 
	} 
	return ; 
} 
 
BOOL CSocketEvent::Clean() 
{ 
	memset( (void*)m_Fdsets, 0, sizeof( __fd_set ) * FDSETCOUNT ); 
	memset( (void*)m_ReadFds, 0, sizeof( __fd_set ) * FDSETCOUNT ); 
	m_Count = 0; 
	return TRUE; 
}