Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
14-6207
Samoilov
2004-02-11 15:49
2004.03.03
Драйвер


1-6060
Drozdov A
2004-02-18 15:22
2004.03.03
If ....Then


6-6169
Vilux
2003-12-25 05:02
2004.03.03
Работа с сокетами в Indy, помогите


14-6189
DNS
2004-02-06 08:01
2004.03.03
DDK к Windows XP


14-6196
Undert
2004-02-11 15:42
2004.03.03
History в ICQ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский