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

Вниз

Непонятная ошибка при вызове WSAWaitForMultipleEvents   Найти похожие ветки 

 
alexEagle ©   (2003-12-25 20:18) [0]

Не могу понять почему следующий выриант вызова указанной функции приводит к результату WSA_WAIT_FAILED. Причем сообщения каждый раз разные! То памяти не хватает, то не туда лезет. Такое впечатление что проблема с указателями, но вот где?

var
WSAEvents: array[0..2] of TWSAEvent;
nRes: Cardinal;
begin
WSAEvents[0] := WSACreateEvent;
WSAEvents[1] := WSACreateEvent;
WSAEvents[2] := WSACreateEvent;
WSAEventSelect(hSocket,WSAEvents[0],FD_READ);
WSAEventSelect(hSocket,WSAEvents[1],FD_WRITE);
WSAEventSelect(hSocket,WSAEvents[2],FD_CLOSE);
while true do begin
nRes := WSAWaitForMultipleEvents(3,@WSAEvents,FALSE,WSA_INFINITE,TRUE);
case nRes of
0: begin if assigned(FOnRead) then FOnRead(hSocket); WSAResetEvent(WSAEvents[0]); end;
1: begin if assigned(FOnWrite) then FOnWrite(hSocket); WSAResetEvent(WSAEvents[0]); end;
3: begin if assigned(FOnClose) then FOnClose(hSocket); break; end;
WSA_WAIT_FAILED: if assigned(FOnError) then FOnError(hSocket);
end;
end;
WSAEventClose(WSAEvents[0]);
WSAEventClose(WSAEvents[1]);
WSAEventClose(WSAEvents[2]);


 
alexEagle ©   (2003-12-25 20:54) [1]

Кстати, ошибка локализована. Невыполняется
WSAEventSelect(hSocket,WSAEvents[0],FD_READ);
Сокеты генерируют ошибку "Попытка выполнить операцию на объекте, не являющемся сокетом"
То, что я отдаю действительно сокет - я гарантирую
Но вот правильно ли я импортировал эту функцию? Я импортирую её вот так:
type
{$NODEFINE TWSAEventSelectProc}
TWSAEventSelectProc = function(hSocket: TSocket; hEventObject: TWSAEvent; lNetworkEvents: LongInt): integer;
var
WSAEventSelect: TWSAEventSelectProc = nil;

ну и потом её загружаю:
LibHandle32 := Windows.LoadLibrary(PChar(DLLStackName32));
if LibHandle <> 0 then
WSAEventSelect := Windows.GetProcAddress(LibHandle32, PChar("WSAEventSelect"));


 
Digitman ©   (2003-12-26 08:54) [2]

все ф-ции Winsock2 API имеют соглашение о вызове STDCALL
ты это соглашение не указал, оттого и проблемы, видимо

это раз

и второе - а на кой шут столько ивентов ? достаточно одного, инициализированного для отслеживания всех необходимых клиентских операций : FD_CONNECT or FD_READ or FD_WRITE or FD_CLOSE ... диспетчер же реализуется с помощью WSAEnumNetworkEvents(), который к тому же автоматически сбрасывает просигналивший ивент в несигнальное состояние

третье.

в общем случае весьма неразумно использовать WSAWaitForMultipleEvents(), ибо эта ф-ция, будучи вызванной и "висящей" в ожидании срабатывания ивентов, не реагирует в это время ни на сообщения код.потоку, вызвавшему ее, ни на сообщения каким-либо окнам, возможно созданным данным код.потоком

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


 
Polevi ©   (2003-12-26 09:47) [3]

и скачай себе winsock2.pas


 
Alex Konshin ©   (2003-12-26 23:05) [4]

Или используй IdWinsock2.pas

А нафига столько event и, соответственно, WSAEventSelect?



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

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

Наверх




Память: 0.48 MB
Время: 0.018 c
14-6203
syte_ser78
2004-02-11 17:48
2004.03.03
Подсчет количества ключей в заданой секции инифайла


1-6149
DeLz
2004-02-19 09:12
2004.03.03
Вызов процедур различной структуры без объявления типа???


1-6112
Mishenka
2004-02-19 14:41
2004.03.03
Как перекодировать текст из Windows кодировки в Dos?


1-6055
Qwer
2004-02-21 17:46
2004.03.03
Открытие файлов


3-5976
Карелин Артем
2004-02-05 12:25
2004.03.03
Структура таблиц для поисковика на FireBird.