Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как узнать о наличие данных в сокете?

841
24 июня 2007 года
_nic
199 / / 29.07.2006
Как узнать о том что на сокет поступила какая то информация.Тоесть к примеру чтобы определять момент когда внутри бесконечного цикла пора использовать recv.
334
24 июня 2007 года
HexEdit
809 / / 27.07.2006
recv ждет данные, т.е. при вызове он ожидает до тех пор, пока не поступят данные.
Вызываешь recv и все... когда данные придут, выполнение кода продолжится само.
350
26 июня 2007 года
cheburator
589 / / 01.06.2006
Цитата: HexEdit
recv ждет данные, т.е. при вызове он ожидает до тех пор, пока не поступят данные.
Вызываешь recv и все... когда данные придут, выполнение кода продолжится само.


Если возникает вопрос, как использовать время ожидания, пока recv ничего не делает (данных для чтения нет), используй средства синхронизации. Под виндами - это WSAAsyncSelect и WSAEventSelect.

342
13 июля 2007 года
Yos
209 / / 21.06.2003
Цитата:
recv ждет данные, т.е. при вызове он ожидает до тех пор, пока не поступят данные.
Вызываешь recv и все... когда данные придут, выполнение кода продолжится само.

при блокирующем режиме некорректное использование которое следует избегать так как вызов может никогда не завершиться. При неблокирующем вызов заканчивается определенной ошибкой, которая говорит что обработка еще не закончена. Конечно можно просто посмотреть сколько байтов пришло без получения, но этого тоже желательно избегать, а то загрузка проца может "зашкалить"...

Цитата:
Если возникает вопрос, как использовать время ожидания, пока recv ничего не делает (данных для чтения нет), используй средства синхронизации. Под виндами - это WSAAsyncSelect и WSAEventSelect.

конечно хорошо но идет завязка на сторонние объекты которые хороши только при небольших размерах и нет необходимости в значительной масштабируемости (хотя можно поспорить, но делать не буду).

Лично я часто использую механизм класического 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 для другой работы если она нужна, дабы не городить сторонние потоки...

52K
27 февраля 2010 года
Karpo
12 / / 04.12.2009
Yos, очень интересный вариант.Но почему-то не верю,что он рациональнее чем wsaasyncselect.Попутно вопрос.А как можно организовать работу обработчика сообщений,которые ОС начинает отправлять после использования wsaasyncselect в отдельном потоке?Ведь при создании потока требуется указать функцию,которая будет в нём выполняться,а у меня в наличии только обработчик сообщений(
355
25 марта 2010 года
<SCORP>
786 / / 21.10.2006
вариант от Yos однозначно рациональнее чем WSAAsyncSelect как минимум тем, что не требует хендла окна и вообще является кроссплатформенным решением. как только приложение перестанет быть оконным (перенесёте код в DLL или windows service), тут же наступите на эти грабли - даже под экзотические юникса лезть не надо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог