программирование сокетов с помощью select - PullRequest
3 голосов
/ 02 марта 2011

У меня есть два узла, взаимодействующих с сокетом.Каждый узел имеет поток чтения и поток записи для связи с другим.Ниже приведен код для прочитанной ветки.Связь прекрасно работает между двумя узлами с этим кодом.Но я пытаюсь добавить функцию выбора в эту ветку, и это вызывает у меня проблемы (код для выбора есть в комментариях. Я просто раскомментирую его, чтобы добавить функциональность).Проблема в том, что один узел не получает сообщения и только делает тайм-аут.Другой узел получает сообщения от другого узла, но никогда не истекает.Эта проблема не существует (оба узла отправляют и получают сообщения) без выбора (сохраняя комментарии / * * /).

Кто-нибудь может указать, в чем может быть проблема?Благодарю.

void *Read_Thread(void *arg_passed)
{   
    int numbytes;
    unsigned char *buf;
    buf = (unsigned char *)malloc(MAXDATASIZE);

    /*
    fd_set master;
    int fdmax;
    FD_ZERO(&master);
    */

    struct RWThread_args_template *my_args = (struct RWThread_args_template *)arg_passed;

    /*
    FD_SET(my_args->new_fd, &master);
    struct timeval tv;
    tv.tv_sec = 2;
    tv.tv_usec = 0;
    int s_rv = 0;
    fdmax = my_args->new_fd;
    */

    while(1)
    {
        /*
        s_rv = -1;
        if((s_rv = select(fdmax+1, &master, NULL, NULL, &tv)) == -1)
        {
            perror("select");
            exit(1);
        }
        if(s_rv == 0)
        {
            printf("Read: Timed out\n");
            continue;
        }
        else
        {
            printf("Read: Received msg\n");
        }
        */
        if( (numbytes = recv(my_args->new_fd, buf, MAXDATASIZE-1, 0)) == -1 )
        {
            perror("recv");
            exit(1);
        }
        buf[numbytes] = '\0';

        printf("Read: received '%s'\n", buf);
    }
    pthread_exit(NULL);
}

1 Ответ

3 голосов
/ 02 марта 2011

Вы должны установить master и tv перед каждым вызовом select() в цикле. Они оба модифицируются вызовом select().

В частности, если select() вернул 0, то master теперь будет пустым.

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