Помощь - Поиск - Пользователи - Календарь
Полная версия: WinSock: select
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
silver
Уважаемый All!
При работе с сокетами использую функцию Select для проверки входящих сообщений. Последним параметром функции является либо время ожидания (через указатель на структуру), либо NULL. В последнем случае функция ждет до получения чего-либо.
Проблема в следущем: если передаю NULL, все нормально работает. А вот если пытаюсь только проверить состояние, то данных нет, и периодически появлется SOCKET_ERROR.
Код следующий:
Код
var Wait: TTimeVal;
...
 Wait.tv_sec := 0;
 Wait.tv_usec := 0;
 Res := select(0, @fdset, nil, nil, @Wait);
...

Будем полагать, что структура fdset заполнена правильно. ;)
Вопрос: как использовать функцию, чтобы результат возвращался сразу, без ожидания?
mj
Попробуй найти в уже написанных компонентах каким образом идёт запрос количества данных в очереди сокета...
Я щас точно не помню, но вроде это не через select делается...
silver
Хм... Уточняю:
Программа работает в локальной сети по TCP/IP (проще говоря, ЧАТ smile.gif)
Общение идет через broadcast-сообщения, потому и сокеты настроены соотвственно. Кстати, может все же что-то не так в настройках сокетов?.. Но тогда почему функция нормально работает с вариантом Select(... ,nil)?
Прочитал Help по API (все по мануалу!), пролистал кучу ссылок в инете, просмотрел что есть в Делфи (кстати, единственное место, где используется функция select - это модуль SvrHTTPIndy.pas, и там все сделано аналогично тому, что я привел выше). Непонятно...
mj
SvrHTTPIndy.pas - это дочерний компонент Indy сокета, так что искать надо в компонента сокета...
А вообще очень легко найти эту функцию отследив функцию получения количества данных в функциях стандартных сокетов...
А select это совсем другое...
silver
Спасибо за помощь!
Оказалось, что перед каждым вызовом select необходимо заново заполнять fdset. А этот ньюанс в API-хелпе для Делфы не описан sad.gif
Теперь усе заработало smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.