2

stdin に何かがある場合に select が返されるのは問題がありますが、それは望んでいません。たとえば、ソケット上のデータを一定時間待機するためのコードを次に示しますが、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
    }
}
4

1 に答える 1

3

FD_ZERO()あなたはあなたのいずれにも決して使用しませんfd_set。FD 0 (stdin) は、他のさまざまなランダム FD とともに、おそらく設定されています。

于 2011-07-06T04:28:13.887 に答える