Форум: "Сети";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];
ВнизНепонятная ошибка при вызове 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c