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;
}