Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ WinSock: select

Автор: silver 22.07.2003 12:12

Уважаемый 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 22.07.2003 12:23

Попробуй найти в уже написанных компонентах каким образом идёт запрос количества данных в очереди сокета...
Я щас точно не помню, но вроде это не через select делается...

Автор: silver 22.07.2003 12:56

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

Автор: mj 4.08.2003 20:16

SvrHTTPIndy.pas - это дочерний компонент Indy сокета, так что искать надо в компонента сокета...
А вообще очень легко найти эту функцию отследив функцию получения количества данных в функциях стандартных сокетов...
А select это совсем другое...

Автор: silver 5.08.2003 11:20

Спасибо за помощь!
Оказалось, что перед каждым вызовом select необходимо заново заполнять fdset. А этот ньюанс в API-хелпе для Делфы не описан sad.gif
Теперь усе заработало smile.gif