У меня проблема с выбором возврата, когда что-то есть в 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
}
}