Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.26;
Скачать: CL | DM;

Вниз

WSAEventSelect   Найти похожие ветки 

 
Akni   (2003-04-17 13:49) [0]

Подскажите, в каком модуле описана функция WSAEventSelect? Подключаю winsock – не помогает. WSAAsyncSelect находит, а WSAEventSelect - нет?


 
Digitman ©   (2003-04-17 14:02) [1]

winsock2.pas

но в станд.поставке Д5 этого модуля нет

const
WINSOCK_VERSION = $0202;
WINSOCK2_DLL = "ws2_32.dll";

interface

function WSAEventSelect( s : TSocket; hEventObject : WSAEVENT; lNetworkEvents : LongInt ): Integer; stdcall;

implementation

function WSAEventSelect; external WINSOCK2_DLL name "WSAEventSelect";

все прочие задействованные декларации/описания есть в станд.хэлпе в Д5

"Winsock2 Programmer"s Reference"



 
Akni   (2003-04-17 16:14) [2]

спасибо


 
Akni   (2003-04-17 16:26) [3]

простите за глупые вопросы, но как быть с hEventObject : WSAEVENT
Можно ли написать hEventObject : THandle?


 
Digitman ©   (2003-04-17 16:59) [4]

да, можно


 
AlexMax ©   (2003-04-17 17:34) [5]

Вообщето, по моему, эта функция называется WSASelectEvent, а не WSAEventSelect. Так что попробуй этот вариант и старайся повнимательнее хелп смотреть.


 
Akni   (2003-04-17 18:43) [6]

Пишу след. код:
var hEventObject: THandle;

procedure TISServerThread.ClientExecute;
...
begin
inherited FreeOnTerminate:=true;
fRecSend:=false;
try
Stream:=TWinSocketStream.Create(ClientSocket, 500);

Res:=WSAEventSelect(ClientSocket.Handle, hEventObject, FD_READ or FD_WRITE);

и получаю на этом месте SocketError 10038

Насколько я понимаю, в качестве парамета s : TSocket указывается хендл сокета, который нужно перевести в неблок. режим. Вот я его вроде бы и беру. hEventObject - просто хендл события, которое наступает при возникновении одного из lNetworkEvents.
В чем тогда моя ошибка?

to AlexMax
Функция называется WSAEventSelect и не по-моему, а точно. Поиск в хелпе WSASelectEvent как раз ничего и не дает


 
Digitman ©   (2003-04-18 08:33) [7]

1.

Res:=WSAEventSelect(ClientSocket. SocketHandle, hEventObject, FD_READ or FD_WRITE);

как инициализируешь hEventObject ? где WSACreateEvent ?

2.

настоятельно не рекомендую использовать класс TWinSocketStream с гнездом , переведенным в неблок.режим для асинхр.нотификаций с использованием AsyncSelect/EventSelect



 
Akni   (2003-04-22 10:33) [8]

настоятельно не рекомендую использовать класс TWinSocketStream с гнездом , переведенным в неблок.режим для асинхр.нотификаций с использованием AsyncSelect/EventSelect

почему? а, точнее, какая тогда альтернатива, что использовать?

У меня такие условия задачи:
1. сервер может посылать данные клиенту при возникновении события на сервере
2. клиент посылает серверу запрос, не всегда требующий ответа со стороны сервера
3. код и сервера, и клиента должен быть реализован в отдельном потоке.

Поэтому хочу создать поток с пом. стандартных блокирующих методов и потом перевести его в неблок. режим.
Буду благодарна за лучшие идеи.



 
Polevi ©   (2003-04-22 10:58) [9]

не делай кашу из clientsocket и winsock вызовов, используй или чистый api или TClientSocket
в твоем случае тебя вполне устроит T..Socket в асинхронном режиме (использует WSAAsyncSelect)


 
Akni   (2003-04-22 11:16) [10]

т.е. делать отдельный кодовый поток, а в нем создавать TClentSocket / TServerSocket в неблокирующем режиме и использовать стандартные события OnRead, onWrite...
Я правильно поняла идею?


 
Digitman ©   (2003-04-22 11:37) [11]


> Akni


да, такой вариант ничем не плох
но, конечно же, все зависит от конкретных требований к задаче

механизм асинхр.нотификации с использованием оконных сообщений (неважно, в каком потоке это реализовано) несколько проигрывает по эффективности механизму асинхр.нотификации с использованием объектов синхронизации, но зато программирование работы гнезда в первом случае заметно проще и практически не выходит за рамки обычной обработки VCL-событий (OnRead, OnWrite и т.д.)


 
Akni   (2003-04-22 11:45) [12]

> Digitman
Основные требования к задаче я описала выше. Еще одно условие: эта задача - аналог удаленного администрирования, т.е. на одной стороне в одном приложении может создаваться несколько клиентских потоков, каждый из которых соединятеся со своим сервером; а на другой стороне сервер работает, как правило, только с одним клиентом.

Какой механизм лучше использовать в данном случае?


 
Digitman ©   (2003-04-22 12:07) [13]

механизм асинхр.нотификации с использованием оконных сообщений (по умолчанию), думаю, вполне сойдет для такой задачи

так что, скорей всего, нет смысла реализовывать иной механизм


 
Polevi ©   (2003-04-22 14:18) [14]

PS
у механизма асинхр.нотификации с использованием объектов синхронизации есть одна неприятная особенность - ф-ия ожидания может ждать максимум 64 объекта, что не удобно при большом кол-ве клиентов, приходится делать пул потоков


 
Anatoly Podgoretsky ©   (2003-04-22 14:28) [15]

Win+F и найдешь sconnect.pas

WSAEventSelect(s: TSocket; hEventObject: THandle; lNetworkEvents: Integer): Integer stdcall;

A это объявление из winsock2.pas
WSAEventSelect(s: TSocket; hEventObject: WSAEVENT; lNetworkEvents: LongInt): Integer; stdcall;

Учись пользоваться Windows



Страницы: 1 вся ветка

Текущий архив: 2003.06.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.019 c
1-84149
Bosso
2003-06-11 09:57
2003.06.26
Как бороть баг с 300-ми кнопками?


4-84818
saha
2003-04-22 13:00
2003.06.26
Активное окно


3-83929
AlexA
2003-05-30 12:06
2003.06.26
Как программным способом изменить ширину MEMO в FastReporte.


3-83873
monax
2003-06-02 15:08
2003.06.26
Конвертация язіка


7-84767
keymaster
2003-04-16 18:21
2003.06.26
Как запустить ScreenSaver?