Monday, August 21, 2006

似乎终于有点看懂select了

从只会用WSAxxxx到看懂select,还真是一个飞跃,赶快记下来。
select一般用于单线程、并发服务器


SOCKET msock;
fd_set rfds, afds;

msock = passiveTCP( service, QLEN );
FD_ZERO( &afds );
FD_SET( msock, &afds );

while( 1 )
{
memcpy( &rfds, &afds, sizeof( rfds ) );
if( select( FD_SETSIZE, &rfds, (fd_set*)0, (fd_set*)0, (struct timeval *)0 ) == SOCKET_ERROR ) )
errexit;
if( FD_ISSET( msock, &rfds ))
{
SOCKET ssock;
alen = sizeof( fsin );
ssock = accept( msock, (struct sockaddr *)&fsin,&alen );
if( ssock == INVALID_SOCKET )
errexit;
FD_SET( ssock, &afds );
}

for( fdndx=0; fdndx < rfds.fd_count; ++ fdndx )
{

SOCKET fd=rfds.fd_array[fdndx];
if( fd != msock && FD_ISSET( fd, &rfds ))
if( echo(fd) == 0 ) // DO Echo Process
{
closesocket( fd );
FD_CLR( fd, &afds );
}
}
}


No comments: