Как узнать о наличие данных в сокете?
Вызываешь recv и все... когда данные придут, выполнение кода продолжится само.
Вызываешь recv и все... когда данные придут, выполнение кода продолжится само.
Если возникает вопрос, как использовать время ожидания, пока recv ничего не делает (данных для чтения нет), используй средства синхронизации. Под виндами - это WSAAsyncSelect и WSAEventSelect.
Вызываешь recv и все... когда данные придут, выполнение кода продолжится само.
при блокирующем режиме некорректное использование которое следует избегать так как вызов может никогда не завершиться. При неблокирующем вызов заканчивается определенной ошибкой, которая говорит что обработка еще не закончена. Конечно можно просто посмотреть сколько байтов пришло без получения, но этого тоже желательно избегать, а то загрузка проца может "зашкалить"...
конечно хорошо но идет завязка на сторонние объекты которые хороши только при небольших размерах и нет необходимости в значительной масштабируемости (хотя можно поспорить, но делать не буду).
Лично я часто использую механизм класического select'а от модели Беркли:
//*************************************************************
//**
//** Проверка на возможность получения входящих данных
//**
//*************************************************************
BOOL XSocket::IsPreparedReading(void)
{
//****
fd_set Read;
timeval Wait;
INT events;
// очищаем набор сокетов
FD_ZERO(&Read);
// добавляем сокет в набор
FD_SET(Socket,&Read);
// заполняем структуру времени ожидания
Wait.tv_sec = 0;
Wait.tv_usec = 100;
// ожидаем подтверждения
events = select(0,&Read,NULL,NULL,&Wait);
// если нет ошибки
if( (events != SOCKET_ERROR) && events ) return TRUE;
return FALSE;
}
- если читать нечего, возвращает через 100 мс FALSE, если есть то TRUЕ и немедленно по наступлении этого случая. При этом время ожидания "переводится" на другие процессы. Кстати данный метод использую при анализе перед отработкой Accept для другой работы если она нужна, дабы не городить сторонние потоки...