У меня есть вопрос, когда я использую select () и read ().коды клавиш: Свернуть
nready = select( maxfd + 1, server->fd_readset, 0, 0, timeout );
if( nready > 0 )
printf( "nready is %d\n", nready );
char buf[100];
int n ;
if ( FD_ISSET( server->fd , server->fd_readset ) ) /* new client connection */
{
int s = (int)accept( server->fd, 0, 0 );
if ( s == -1 )
{
printf( " errno is %d\n", errno );
fprintf( stdout, "error is %s\n", strerror( errno ) );
}
printf( "s is %d\n", s );
for ( j = 0; j < FD_SETSIZE; j++ )
{
if ( client[j] < 0 )
{
if( s > 0 )
client[j] = s; /* save descriptor */
break;
}
}
if ( j == FD_SETSIZE )
{
printf( "too much clients!\n" );
}
FD_SET( s, server->fd_set ); /* add new descriptor to set */
if( s > maxfd )
maxfd = s; /* for select */
if( j > maxi )
maxi = j; /* max index in client[] array */
if( --nready <= 0 )
continue;
}
for( j = 0; j <= maxi; j++ )
{
if( ( sockfd = client[j] ) < 0 )
continue;
if( FD_SET( sockfd, server->fd_readset ) )
{
if( ( n = read( sockfd, buf, 100) ) != 0 )
{
Вопрос: я запускаю сервер, но я просто позволяю только одному клиенту отправлять сообщения на сервер функцией write ().другой клиент не может отправлять сообщения.у меня отладка по GDB, я обнаружил, что сервер блокируется в read ();сервер все еще читает первый клиент.я пытаюсь использовать alarm () для ее решения, но это не работает. Когда read () делает тайм-аут, он все еще блокируется.Пожалуйста, скажи мне почему?спасибо.