linux: stdin заставляет select возвращаться, когда я этого не хочу - PullRequest
2 голосов
/ 06 июля 2011

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

int mylib_UDP_Client_Recv(int sock, void *data, int max_length, int timeout)
//timeout is taken to be milliseconds
{
    struct sockaddr_in sdata;
    struct timeval timeouts;

    timeouts.tv_sec = timeout / 1000;
    timeout -= timeouts.tv_sec * 1000;
    timeouts.tv_usec = timeout * 1000;

    int n;
    int maxfd = sock;
    fd_set static_rdset, static_wrset, rdset, wrset;
    unsigned int datalen = sizeof(struct sockaddr_in);

    FD_SET(sock,&static_rdset);
    FD_SET(sock,&static_wrset);


    rdset = static_rdset;
    wrset = static_wrset;
    if (select(maxfd+1,&rdset,NULL,&wrset,&timeouts) == 0) //wrset used as exception set
    {
        return -1; //timed out
    }
    if (FD_ISSET(sock,&rdset))
    {
        n = recvfrom(sock,data,max_length,0,(struct sockaddr *)&sdata,&datalen);
        if (n < 0) return 0;
        return n;
    }
    else
    {
        return 0; //error
    }
}

1 Ответ

3 голосов
/ 06 июля 2011

Вы никогда не используете FD_ZERO() ни на одном из ваших fd_set с. FD 0 (stdin), вероятно, установлен, наряду с различными другими случайными FD.

...