![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Windows Socket Error 11001 trouble [D5, WinME]
Rodion © (2002-08-26 12:10:00)Привет, мастера!
При написании простенького приложения для работы с сетью с использованием ClientSocket возникла ситуация, при которой выдается exception "Windows Socket Error: (11001) on API ASync Lookup".
Такое происходит только если из машины, на которой запускаем клиент, выдернуть сетевой шнур.
При этом событие OnError не вызывается.
Как отловить этот exception?
Digitman (2002-10-23 11:08:00) [21]Host not found - ошибка, которая может возникнуть на любой стороне. И возникает она при попытке разрешения имени в IP-адрес.
Касамемо клиента, для реального коннекта с сервером ему требуется именно IP-адрес, а не имя целевого хоста - хоста сервера. И если ты не указал в св-вах клиентского компонента этот IP-адрес, а указал вместо него имя хоста, то перед попыткой коннекта в коде кл.компонента будет вызвана lookup-процедура (WSAAsyncLookup для неблок.режима). Цель ее - используя все доступные клиенту DNS-службы, получить IP-адрес для интересующего имени хоста. И если по тем или иным причинам имя хоста не может быть разрешено в его IP-адрес, то возбуждается как раз то исключение с кодом 11001 (Windows Socket Error: (11001) on API ASync Lookup). Т.е. до попытки коннекта даже дело не доходит !!!! А перехват исключений с пом-ю SetErrorProc() предназначен ТОЛЬКО для последующей собственной обработки искл-й, возможных начиная ИМЕННО С ПОПЫТКИ КОННЕКТА и всех остальных (собственно транспорт и дисконнект), которые могут возникнуть уже после успешного коннекта.
Все исключения гнездового транспорта (см. Winsock.pas), имеют базу BASERR = 10000 и перехватываются с пом.SetErrorProc()
Все прочие исключения, связанные в дан.случае с разрешением имени, имеют базу BASERR = 11000 и перехватываются, например, Application.OnException
alex_ustasu (2002-10-23 09:38:00) [22]Я говорю о клиенте, конечно. Эта ошибка, вероятно, может быть только у него(если я правильно интерпретирую смысл "Host Not Found"). Я писал "передавались" в том смысле, что вызывается мой обработчик ошибок. Серверный обработчик обзывается ServerSocketClientError.
Digitman (2002-10-22 17:58:00) [23]>alex_ustasu
Ответь сначала - о чем ты вообще ведешь речь.
Автор (Rodion) вел речь явно о клиенте (см. ссылку в 1-м посте на ClientSocke)
Ты же почему-то - об обработке ошибок на серверной стороне
Цитирую :
>>и они нормально передавались процедуре OnСlientSocketError
OnСlientSocketError - это же событие сервера ! Разве о приложении-сервере мы тут говорим ?
Давай-ка расставляй точки над i сначала..
alex_ustasu (2002-10-22 17:46:00) [24]Позволю себе тоже обращаться на "ты", если можно.
Ты же сам в своем первом ответе на основной вопрос сделал ссылку на SetErrorProc!
Мне интересно, почему она этот хост не находит(код ведь об этом говорит), когда он "живой" и на IP-сетке! С другого хоста возвращается 100061, и все работает обычным образом.
Каков же выход? Использовать сначала функции из Winsock2 ?
Digitman (2002-10-22 17:07:00) [25]А потому что отказ разрешения имени хоста никак не связан с ошибками гнездового транспорта. Разрешение имени хоста в его IP-адрес есть функциональность, независящая от того, есть объект-гнездо или нет его.
Обрати внимание - все, что связано с TSocketErrorProc, используется лишь для перехвата исключений, отражающих контекст ошибок конкретного гнезда (об этом говорит класс исклюяений -ESocketError).
Lookup-же ф-ции не "привязаны" ни к какому конкретному гнезду, задача этих ф-ций - используя DNS-механизм, получить IP-адрес целевого хоста (по его имени) и подставить этот адрес в структуру, используемую для инициализации конкретно создаваемого (уже после этого !) гнезда.
alex_ustasu (2002-10-22 16:54:00) [26]Да та же самая: 11001 ...Но дело, конечно, не в количестве. Это происходит при обращении к одному конкретному хосту(не знаю, в чем его особенность). При обращении к другим хостам были ошибки 100060 и 100061 (или без ошибки), и они нормально передавались процедуре OnСlientSocketError(если провести инициализацию SetErrorProc). А эта ошибка не перехватывается.
Digitman (2002-10-22 16:29:00) [27]ну и какова точная диагностика исключения, возникающего "на 13-й раз" ?
alex_ustasu (2002-10-22 15:45:00) [28]Однако теперь происходит такая вещь: 12 раз все срабатывает нормально(опрашиваю 4 порта на каждом сервере), а на 13 все-таки выполняется Raise в процедуре TCustomWinSocket.CMLookupComplete
модуля ScktComp...
alex_ustasu (2002-10-22 13:19:00) [29]Cогласен, но не на все 100%. Дискутировать,однако, не буду.
Digitman (2002-10-22 13:07:00) [30]Просто хэлп нужно читать)
Он ведь для тебя писан Борландом
alex_ustasu (2002-10-22 13:04:00) [31]DigitMan, большое спасибо!!! Никто до вас не мог подсказать, как это сделать. Получилось. Столько времени угрохал и испытал разочарований из-за ерунды. "Трудно быть бестолковым". Однако странно, почему так реализован компонет...
Digitman (2002-10-22 12:42:00) [32]Replaces the exception handler for error messages that are received from a Windows socket connection.
Unit
ScktComp
Category
exception handling routines
type TSocketErrorProc = procedure(ErrorCode: Integer);
function SetErrorProc(ErrorProc: TSocketErrorProc): TSocketErrorProc;
Description
Call SetErrorProc to assign an exception handler for error messages from Windows socket API calls. By default, socket components have no special error handler and simply raise an ESocketError exception when they receive error messages. If an exception handler is assigned using SetErrorProc, the socket component does not raise this exception.
The ErrorProc parameter specifies the exception handler. It is passed the Windows socket error code. Inside this exception handler an application can compensate for the error or raise an exception. Passing a value of nil for the ErrorProc parameter restores the default behavior, where the socket component raises an ESocketError exception.
SetErrorProc returns the current exception handler. This value is nil when SetErrorProc is called for the first time, and is the value of the ErrorProc parameter from the previous invocation of SetErrorProc thereafter.
alex_ustasu (2002-10-22 12:17:00) [33]Чья это функция, Digitman ?
Digitman (2002-08-26 16:29:00) [34]cм. ф-цию SetErrorProc()