while ((sel = select(s, &rfd, NULL, NULL, &time_val)) <= 0) {
res = sendto(s, dns_datagram, data_curlen, flags, (struct sockaddr*) &addr,
sizeof(struct sockaddr_in));
if (res < 0) {
printf("res = %d\nError. Server offline?\n", res);
printf("sel = %d\n", sel); // out 0
}
FD_ZERO(&rfd);
FD_SET(s, &rfd);
}
Первое, почему условие <=0 а не ==0? Возврат -1 означает ошибку, и не должен проглатываться. Таймаут - это именно 0.
И я вижу косяк в первом аргументе у select.
nfds This argument should be set to the highest-numbered file
descriptor in any of the three sets, plus 1. The
indicated file descriptors in each set are checked, up to
this limit (but see BUGS).
Т.е. тебе нужно s+1 туда передать.
И да, MSDN пишет:
nfds Ignored. The nfds parameter is included only for compatibility with Berkeley sockets.
Вот почему под виндой работает.