Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Windows Socket Error 11001 trouble [D5, WinME]


Страницы:   1 2

Rodion ©   (2002-08-26 12:10:00) 

Привет, мастера!
При написании простенького приложения для работы с сетью с использованием ClientSocket возникла ситуация, при которой выдается exception "Windows Socket Error: (11001) on API ASync Lookup".
Такое происходит только если из машины, на которой запускаем клиент, выдернуть сетевой шнур.
При этом событие OnError не вызывается.

Как отловить этот exception?


Digitman   (2002-10-25 16:13:00) [1]

Что ж ты молчишь-то, что под отладчиком все это делаешь ?)

Я тут, понимаешь ли, парюсь, думаю как ему помочь, а он видите ли даже не удосужился сообимть, что все это - под отладчиком)..
Ты в настройки интегрированного отладчика Делфи ходил ? Настраивал соотв.опции ? Видимо, нет. Потому как первое исключение выбрасывает тебе именно отладчик !!!! А у него - наивысший приоритет, и он перехватывает любые исключения ДО того, как их обработка будет передана в соответствующие процедуры. И эта возможность настраивается (включается/отключается) опционально в меню настроек дебаггера.
Что, по вот этой фразе "Use Step or Run to continue" так трудно было это сообразить ?)


alex_ustasu   (2002-10-25 15:59:00) [2]


1) Project ... raised Exception Class ESocketError with message
"Windows Socket Error (11001), оn API "Async LookUp". Process stopped. Use Step or Run to continue

2)Windows Socket Error: (11001), on API "Async LookUp"


Digitman   (2002-10-25 15:38:00) [3]

Еще раз - приведи мне дословно текст диагностики исключений обоих диалоговых окон, возникающих при отсутствии перехвата OnException()


alex_ustasu   (2002-10-25 15:32:00) [4]

Я уже писал выше, что если я перехвачу

Application.OnException:=AppException;

то второе диалоговое сообщение об ошибке в этом обработчике не выдается(всего их выдается два, последовательно, если не перехватывать). Но выдача первого диалогового сообщения все-таки производится. И происходит это в процедуре TCustomWinSocket.CMLookupComplete модуля ScktComp.


Digitman   (2002-10-25 15:08:00) [5]

Т.е., ты хочешь сказать, что сначала ты получаешь диалоговое окно с сообщением об исключении, а уж только потом ты ловишь BP в теле procedure TMain_Form.AppException() ? Правильно я понял ?


Digitman   (2002-10-25 15:01:00) [6]

извиняюсь. вижу.


Digitman   (2002-10-25 14:59:00) [7]

Так, ну и где у тебя тут вызов SetErrorProc() ? Не вижу нигде.
еще раз - см. Digitman © (22.10.02 12:42)


alex_ustasu   (2002-10-25 14:32:00) [8]

Пожалуйста:
type
server_response_type=(server_notcontacted,server_responsed,server_contacted,server_connected);
var
sever_response:server_response_type;
{-------------------------------------------------------------}
procedure SocketErrorProc(ErrorCode:integer);
begin
server_response:=server_responsed
end;
{-------------------------------------------------------------}
procedure TMain_Form.AppException(Sender: TObject; E: Exception);
begin
if WSAGetLastError <> 0 then SocketErrorProc(WSAGetLastError)
end;
{---------------------------------------------------------------}
procedure TMain_Form.ClientSocketError(Sender: TObject;Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
server_response:=server_responsed;
ClientSocket.Socket.Disconnect(Socket.Sockethandle);
ErrorCode:=0
end;
{---------------------------------------------------------------}

SetErrorProc(SocketErrorProc);
Application.OnException:=AppException;
server_response:=server_notcontacted;
try
ClientSocket.Active:=true;
while server_response=server_notcontacted
do Application.ProcessMessages
except on EsocketError do SocketErrorProc(WSAGetLastError)
end;


Digitman   (2002-10-25 14:11:00) [9]


> есть проблема

Да почему ты считаешь, что это проблема ? Тем более - настолько глобальная, что многие, по-твоему, всенепременно должны были с ней столкнуться ? Не проблема это, а какое-то нарушение логики в твоем собственном коде ! Поэтому и говорю : хочешь помощи - приводи код. Чего из пустого в порожнее перемалывать ?


alex_ustasu   (2002-10-25 13:46:00) [10]

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


Digitman   (2002-10-25 13:22:00) [11]

Не хочешь, значит, трассировать ? Или не умеешь ?

Тогда без кода целиком ничего сказать не могу. Говорим с тобой на разных языках.


alex_ustasu   (2002-10-25 13:00:00) [12]

Зачем ? Дальнейшее меня уже не интересует. Сообщение-то выдается...


Digitman   (2002-10-25 12:53:00) [13]

поставь BP на строчке

raise ESocketError.CreateResFmt(@sWindowsSocketError,
[SysErrorMessage(Message.AsyncError), Message.ASyncError, "ASync Lookup"]);

и отрассируй пошагово дальнейший ход выполнения


alex_ustasu   (2002-10-25 12:45:00) [14]

Digitman. Начну с последнего замечания(Что тут непонятного). Я написал, что как раз это я понял(я ведь не задал вопрос).
Поскольку ты все объясняешь, как это работает или должно работать, но не нарисуешь работающий пример, который бы решал обозначеннную в основном вопросе темы проблему(что закрыло бы тему сразу), я делаю вывод, что непосредственно с этой проблемой ты лично не сталкивался. Я написал, что использовал все известные мне на данный момент процедуры-перехватчики:
Application.OnException:=AppException;
SetErrorProc(SocketErrorProc);
ClientSocketError
AppException(повторюсь)подавляет выдачу лишь второго сообщения при завершении обработки ошибки обозначеннной библиотечной функцией.
И ни одна из них не решает проблемы. Что конкретно советуешь ?
PS: Работаю с D5 в Windows98 Second Edition.


Digitman   (2002-10-25 11:52:00) [15]

Вот выдержка из хэлпа :

OnException only handles exceptions that occur during message processing. (1)
Exceptions that occur before or after the execution of the application’s Run method do not generate OnException events. (2)

Условие (1) явно соблюдается
Условие (2) - проверяй сам.

При соблюдении этих условий (и + при условии (3) - CustomWinSocket создан в основном код.потоке процесса), OnException всегда будет генерироваться, вне зависимости от источника исключения.

Вот еще уточнение - вникни в него :

If an exception passes through the try blocks in the application code, the application automatically calls the HandleException method. Unless the exception object is EAbort, HandleException calls the OnException handler, if one exists. Otherwise, it calls ShowException to display a message box indicating an error occurred.

>>предполагаю, что код возвращается в случае, если на сервере >>нет IP(Я сканирую сеть с помощью WNetEnumResource. В >>полученном списке присутствую все компьютеры сети, и не все >>они на IP).

Ну правильно !! Имя машины не есть то же самое, что и имя хоста. Если DNS-сервис (к которорому осуществляется обращение в ходе выполнения WSAAsyncGetHostByName) совместно с DHCP-сервисом в момент запроса может разрешить указанное NetBIOS-имя, результатом будет IP-адрес хоста (ассоциированного с ресурсом), иначе - отказ 11001. Что тут удивительного и непонятного ?


alex_ustasu   (2002-10-25 11:29:00) [16]

Digitman, я описал ситуацию, которая возникает у меня.
Мне не нужно приводить этот текст. Именно здесь и происходит выдача злополучного сообщения выполнением raise ESocketError.CreateResFmt. И ничего от этого не спасает, как я написал в предыдущем сообщении: ни установка SetErrorProc, ни перехват Application.OnEception.Может быть, в AppException надо как-то подавить ошибку ?
Да, мы ведем речь о клиенте. И я говорю о том, в каком случае возвращается этот код. Я предполагаю, что код возвращается в случае, если на сервере нет IP(Я сканирую сеть с помощью WNetEnumResource. В полученном списке присутствую все компьютеры сети, и не все они на IP).


Digitman   (2002-10-25 10:50:00) [17]


> какой-то кривизне IP-стека на сервере


Какой еще "кривизне" ? Какого сервера ? Мы тут о клиенте речь ведем ! Только (!!!!) о клиентском процессе, который вызывает WinsockAPI-ф-цию WSAAsyncGetHostByName() перед connect(), если в TClientSocket указано имя хоста сервера вместо его IP-адреса.
В этом случае Winsock асинхронно известит процесс о результатах разрешения имени посылкой сообщения в окно, организованное объектом TCustomWinSocket, специально для приема нотификаций от Winsock.

Вот штатный обработчик нотификации для данного случая :


procedure TCustomWinSocket.CMLookupComplete(var Message: TCMLookupComplete);
begin
if Message.LookupHandle = FLookupHandle then
begin
FLookupHandle := 0;
if Message.AsyncError <> 0 then //если в ходе разрешения имени хоста/сервиса возник отказ
begin
Disconnect(FSocket); // уничтожить гнездо
raise ESocketError.CreateResFmt(@sWindowsSocketError,
[SysErrorMessage(Message.AsyncError), Message.ASyncError, "ASync Lookup"]); // возбудить исключение с кодом ошибки, возвращенным в Message.AsyncError
end;
if FLookupState = lsLookupAddress then
begin
FAddr.sin_addr.S_addr := Integer(Pointer(PHostEnt(FGetHostData).h_addr^)^);
ASyncInitSocket("", "", FService, FPort, FQueueSize, FClient);
end else if FLookupState = lsLookupService then
begin
FAddr.sin_port := PServEnt(FGetHostData).s_port;
FPort := 0;
FService := "";
ASyncInitSocket("", "", "", 0, FQueueSize, FClient);
end;
end;
end;


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


alex_ustasu   (2002-10-25 10:14:00) [18]

К сожалению, ни SetErrorProc, ни использование AppException не помогают избавиться от выдачи сообщения об ошибке 11001. Перехват AppException предотвращает лишь выдачу второго сообщения при завершении обработки ошибки. Я предполагаю, что ошбка возникает при отсутствии или какой-то кривизне IP-стека на сервере. Интересено, как же остальные это обходят ? Скорее всего использоанием функций WinSock. Поделился бы кто информацией...


Digitman   (2002-10-23 13:01:00) [19]

Нет, на серверной не может. Сервер всегда знает IP-адрес подключившегося к нему клиенту.


alex_ustasu   (2002-10-23 12:22:00) [20]

Если мы говорим о компонентах Delphi ClientSocket и ServerSocket, и я активирую серверный компонент, эта ошибка может возникнуть на его стороне ? Я это не исследовал, конечно, но может быть(если стек не установлен, например ?)...
У меня пока не получилось перехватывать и с Try .. Exception.
Если в цикле ожидания завершения запроса не обрабатывать Application.ProcessMessages, то ожидание бесконечное. А если обрабатывать, то Raise Exception выполняется в процедуре, о которой я упоминал.
Попробую еще раз, может что-то не так делал


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо