выберите и некоторые клиенты - PullRequest
0 голосов
/ 03 мая 2011

Я запутался, что у меня есть сервер по select ().и я могу принять некоторых клиентов.но я только читаю информацию от клиента при подключении сервера в конце.например: клиент A, B, C подключается к серверу по очереди.сервер просто распечатывает данные из C.

, когда я его выводю, он все время блокируется в select ().ты можешь сказать мне, почему?благодарю вас.основной код:


спасибо, я обновил вопрос и изменил код на http://www.gnu.org/s/hello/manual/libc/Server-Example.html

, но проблема все еще осталась.я все еще получаю данные только с конца.и я не могу получить данные из прежнего.

основной код:

int read_from_client (int filedes)
{буфер символов [MAXMSG];
int nbytes;

    nbytes = read( filedes, buffer, MAXMSG );

    if ( nbytes < 0 )
    {
            /* Read error */
            perror( "read" );
            exit( EXIT_FAILURE );
    }
    else if ( nbytes == 0 )
    /* End-of-file. */
            return -1;
    else
    {
            /* Data read. */
            fprintf( stderr, "Server: got message: '%s'\n", buffer );
            return 0;
    }

}

int ts_server_poll (struct tcp_server * server, struct timeval * timeout) {
unsigned int i;
int nready, sockfd, k, j;

    <br>//reset the fd set
    _server_set_fd( server );

    printf( "maxfd is %d\n", maxfd );
    FD_SET( server->fd, server->fd_set );

    while ( 1 )
    {
            /* Block until input arrives on one or more active sockets. */
            server->fd_readset = server->fd_set;

            if ( select( FD_SETSIZE, server->fd_readset, NULL, NULL, NULL ) < 0 )
            {
                    perror ( "select" );
                    exit( EXIT_FAILURE );
            }



            /* Service all the sockets with input pending */
            for ( i = 0; i < FD_SETSIZE; ++i )
                    if ( FD_ISSET( i, server->fd_readset ) )
                    {
                            if ( i == server->fd )
                            {
                                    /* Connection request on original socket. */
                                    int new;
                                    new = (int)accept( server->fd, 0, 0 );

                                    if ( new < 0 )
                                    {
                                            perror( "accept" );
                                            exit( EXIT_FAILURE );
                                    }

                                    FD_SET( new, server->fd_set );
                            }
                            else
                            {
                                    /* Data arriving on an already-connected socket. */
                                    if ( read_from_client( i ) < 0 )
                                    {
                                            close( i );
                                            FD_CLR( i, server->fd_set );
                                    }

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

В вашем коде не хватает нескольких вещей ... принятие новых соединений и прохождение всех дескрипторов в наборе чтения.

Вот полный пример использования select на сервере:

http://www.gnu.org/s/hello/manual/libc/Server-Example.html

1 голос
/ 03 мая 2011

Вы должны делать это в цикле.Я имею в виду, проверяя FD_ISSET от 0 до maxfd + 1 и затем весь этот джаз.

for(sockfd = 0; sockfd < maxfd + 1; sockfd++) {
    if(FD_ISSET(sockfd, server->fd_readset)) {
        /* there is an event on sockfd */
    }
}

Я некоторое время не использовал select, но с этим все должно быть в порядке.Кроме того, вы можете пропустить дескрипторы 0, 1, 2, но это будет ужасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...