Использование select () для тайм-аута - PullRequest
6 голосов
/ 21 марта 2012

Мне удалось установить максимум 20 секунд в качестве параметра времени ожидания в select () API.Независимо от того, какое значение я дал выше 20, select () возвращается через 20 секунд ... Так что я пытался написать цикл для тайм-аута в 1 минуту, как это

    int timeoutcount = 0;
    do
    {
    FD_ZERO(&fd);
    FD_SET(sock,&fd);
    timeout.tv_sec = 20;
    timeout.tv_usec = 0;
    rc = select (sock+1,&fd,null,null,&timeout);
    if(rc ==0)
    timeoutcount += 20;
    }
    while(rc ==0 && timeoutcount <60)

, пожалуйста, помогите мне ..Я иду в правильном направлении?Если это так, select возвращает 1 после первого тайм-аута. Помогите мне понять это тоже. Примечание: я использую его в цели C

1 Ответ

10 голосов
/ 21 марта 2012

Не существует 20-секундного максимума для тайм-аута для выбора - что-то другое (скорее всего, данные, готовые для чтения на вашем сокете) должно было вызывать преждевременное возвращение select (). Если вы действительно хотите использовать select () для сна, попробуйте вызвать его так:

struct timeval tv = {600, 0};   // sleep for ten minutes!
if (select(0, NULL, NULL, NULL, &tv) < 0) perror("select");
...