Windows-сокеты имеют функцию select
. Вы передаете ему дескриптор сокета и сокет для проверки читабельности, а также время ожидания, и оно возвращает информацию о том, стал ли сокет доступным для чтения или истекло ли время ожидания.
См .: http://msdn.microsoft.com/en-us/library/ms740141(VS.85).aspx
Вот как это сделать:
bool readyToReceive(int sock, int interval = 1)
{
fd_set fds;
FD_ZERO(&fds);
FD_SET(sock, &fds);
timeval tv;
tv.tv_sec = interval;
tv.tv_usec = 0;
return (select(sock + 1, &fds, 0, 0, &tv) == 1);
}
Если он возвращает true, ваш следующий вызов recv
должен немедленно вернуться с некоторыми данными.
Вы можете сделать это более надежным, проверив select
на наличие возвращаемых значений ошибок и выбрасывая исключения в этих случаях. Здесь я просто возвращаю true
, если он говорит, что один дескриптор готов к чтению, но это означает, что я возвращаю false
при любых других обстоятельствах, включая сокет, который уже закрыт.