Проблема в том, что fd_set в linux является битовым массивом (изначально это был просто int, но тогда вы могли наблюдать только первые 16 io вашего процесса). В windows fd_set представляет собой массив сокетов с длиной спереди (поэтому окнам не нужно знать, сколько бит смотреть).
Функция poll () принимает массив записей для просмотра в linux и имеет другие преимущества, которые делают ее лучшим выбором, чем select ().
int recvTimeOutTCP( SOCKET socket, long msec )
{
int iret ;
struct polldf sockpoll ;
sockpoll.fd= socket ;
sockpoll.events= POLLIN ;
return poll(& sockpoll, 1, msec) ;
}