select всегда возвращает -1 при попытке чтения из сокета и стандартного ввода - PullRequest
1 голос
/ 25 апреля 2010

У меня есть следующий код, реализованный на C ++ (Linux), чтобы проверить мой сокет прослушивания и стандартный ввод, используя select. однако select продолжает возвращать -1 независимо от того, что я пытаюсь сделать! Что не так с этим кодом: я буду признателен за любую помощь. Спасибо

highsock = m_sock; //listening socket

memset((char *) &connectlist, 0, sizeof(connectlist));
memset((char *) &socks, 0, sizeof(socks));

int readsocks;
struct timeval timeout;
timeout.tv_sec = 60;
timeout.tv_usec = 0;

while (1) {
    updateSelectList();
    //cout << "highest sock: " << highsock << endl;
    tempreadset = readset;
    readsocks = select(highsock+1, &tempreadset, NULL, NULL, &timeout);
    //cout << "# ready: " << readsocks << endl;
    if (readsocks < 0) {
        if (errno == EINTR)
            continue;
        cout << "select error" << endl;
    }
    if (readsocks > 0) {
        readFromSocks();
    }
}

void readFromSocks() {
    if (FD_ISSET(STDIN, &readset)) {
    ...
    } else if (FD_ISSET(m_sock, &readset)) {
    ...
    }
}

void updateSelectList() {
    FD_ZERO(&readset);

    FD_SET(STDIN, &readset);
    FD_SET(m_sock, &readset);

    for (int i=0; i<MAXCONNECTIONS; i++) {
        if (connectlist[i] != 0) {
            FD_SET(connectlist[i], &readset);
            if (connectlist[i] > highsock)
                highsock = connectlist[i];
        }
    }

    highsock = max(max(m_sock, STDIN), highsock);
}

1 Ответ

0 голосов
/ 25 апреля 2010

Что-то изменить, что может помочь:

1) Установите highsock на -1 в верхней части каждого цикла while (в противном случае он может быть слишком высоким, отражая сокет, который раньше был искусством вашего набора сокетов, но теперь недопустим)

2) Установите значения в структуре timeval в начале каждого цикла, а не один раз до начала цикла. (Кроме того, вы можете передать NULL в качестве аргумента timeval просто для того, чтобы убедиться, что это устранит проблему ... Я видел сбой select () при передаче временного интервала, который ему не понравился)

...