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

Вниз

Сокеты... ошибка 11001 и пр. Что с ними делать?   Найти похожие ветки 

 
SergP ©   (2003-09-28 13:23) [0]

Что можно сделать чтобы избавится от "выскакивания" окна с сообщением об ошибке 11001 и других ошибок, которые не устраняются с помощью:

procedure TForm1.ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
...
ErrorCode:=0;
...
end;

И вообще как эти ошибки можно обработать програмно?


 
Анатолий   (2003-09-28 20:32) [1]

если знаешь часть кода на которой бывает ошибка попробуй заключить ее в try ... except


 
SergP ©   (2003-09-28 20:54) [2]

Ошибка 11001 возникает при попытке конекта клиентсокета когда у меня инет отключен. Но что заключать в try..except..end;?
Clientsocket.open пробовал заключать - не помогает.


 
Sergp ©   (2003-09-29 14:01) [3]

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


 
Анатолий   (2003-09-29 14:04) [4]

найди отладчиком момент возникновения ошибки, может это не cs.open а где то в другом месте ? пройди по проге пошагам и найди...


 
Polevi ©   (2003-09-29 14:05) [5]

Application.OnException поймает все не обработанные исключения


 
Sergp ©   (2003-09-29 14:24) [6]


> Анатолий (29.09.03 14:04) [4]
> найди отладчиком момент возникновения ошибки, может это
> не cs.open а где то в другом месте ? пройди по проге пошагам
> и найди...


В хелпе написано :
11001 Authoritative answer: Host not found.
У меня так оно и есть... Неподключен к инету - возникают такие ошибки при попытке сокета сконектиться. Так что имхо однозначно в этом виноват clientsocket при попытке сделать ему open...
насчет отладчика попытаюсь...

> Polevi © (29.09.03 14:05) [5]
> Application.OnException поймает все не обработанные исключения


Можно подробнее с небольшим примерчиком?
Да и кстати, у меня иногда (очень редко при работе проги вылезает окно с ошибкой вроде External exception 80000003 (точно не помню) , что это такое? И можно ли с помощью Application.OnException и ее тоже устранить?


 
Sergp ©   (2003-09-29 14:24) [7]


> Анатолий (29.09.03 14:04) [4]
> найди отладчиком момент возникновения ошибки, может это
> не cs.open а где то в другом месте ? пройди по проге пошагам
> и найди...


В хелпе написано :
11001 Authoritative answer: Host not found.
У меня так оно и есть... Неподключен к инету - возникают такие ошибки при попытке сокета сконектиться. Так что имхо однозначно в этом виноват clientsocket при попытке сделать ему open...
насчет отладчика попытаюсь...

> Polevi © (29.09.03 14:05) [5]
> Application.OnException поймает все не обработанные исключения


Можно подробнее с небольшим примерчиком?
Да и кстати, у меня иногда (очень редко при работе проги вылезает окно с ошибкой вроде External exception 80000003 (точно не помню) , что это такое? И можно ли с помощью Application.OnException и ее тоже устранить?


 
Polevi ©   (2003-09-29 14:51) [8]

окно можно устранить, но ты лучше устрани причину


 
nikkie ©   (2003-09-29 16:18) [9]

а почему ты думаешь, что ошибку вызывает серверный сокет? скорее клиентский - и обрабатывать ошибку надо в СlientSocket.OnError.


 
Sergp ©   (2003-09-29 19:38) [10]

Хм... Опять как оказалось не тот кусок кода написал. Просто обработчики у меня почти одинаковые...
Вот точная копия обоих обработчиков. В обоих я Errorcode устанавливаю в 0, но это не помогает. И по всей видимости при ошибке 11001 OnError не вызывается...

procedure TForm1.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
memo1.lines.add("CSError "+inttostr(ErrorCode)+" "+inttostr(integer(sender)));
TCustomWinSocket(socket.data).free;
ErrorCode:=0;
PostMessage(Form1.Handle, KILL_SOCKET, 0,integer(Sender));
end;

procedure TForm1.ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
memo1.lines.add("SSError "+inttostr(ErrorCode)+" "+inttostr(integer(socket.data)));
KSocket(socket.data).free;
ErrorCode:=0;
Postmessage(Form1.Handle, KILL_SOCKET, integer(socket),0);
end;

А насчет второй ошибки, я даже не могу понять от чего она возникает, причем очень редко. Вроде бы уже принял все меры против этого...


 
aprm_85 ©   (2003-09-30 22:52) [11]

А может прежде чем коннектится к хосту, проверить, есть ли Инет?
Если dial-up, все просто: TMagRAs (компонент для работы с dialup)
С выделенкой - сложнее. там возможгы варианты


 
SergP ©   (2003-10-01 07:21) [12]


> aprm_85 © (30.09.03 22:52) [11]
> А может прежде чем коннектится к хосту, проверить, есть
> ли Инет?
> Если dial-up, все просто: TMagRAs (компонент для работы
> с dialup)
> С выделенкой - сложнее. там возможгы варианты


Это ИМХО излишне. Да и как оказалось эта ошибка ловится Application.OnException как советовал Polevi. Просто я этой штукой никогда не пользовался раньше и сначала не пользовался потому, что хотел бы иметь сначала пример прежде чем использовать, но в связи с тем что примера так и никто не дал, пришлось самому экспериментировать.


 
nikkie ©   (2003-10-01 13:44) [13]

Application.OnException - это, конечно, лом, против которого нет приема. Только прибегать к нему стоит, если ты совсем сдался сделать по нормальному.

Я только что попробовал - 11001, "Windows socket error: No such host is known (11001), on API "ASync Lookup"" прекрасно ловится и гасится в OnError (по-крайней мере в D6). Ты пробовал это в тестовом приложении - один клиентский сокет на форме? Попробуй. И покажи, как ты создаешь сокет в приложении, где у тебя проблема.


 
SergP ©   (2003-10-02 08:56) [14]

2 nikkie У меня D5... Да и переходить на D6 почему-то не очень хочется. Хотя возможно что придется... Не знаю почему оно у Вас ловится в onError, но у меня ловятся там все остальные ошибки кроме 11001.

А насчет того чтобы показать как что и где я создаю - может лучше я скину исходник на мыло? А то много постить тут нужно...


 
Digitman ©   (2003-10-02 09:15) [15]


> SergP


по кр.мере в D5 отказ с кодом WSAHOST_NOT_FOUND = 11001 не может быт перехвачен в событии OnError, только - в App.OnException

этому есть вполне четкое объяснение, достаточно взглянуть в исх.текст компонента


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"]);
end;
.....................
end;
end;


 
Digitman ©   (2003-10-02 09:29) [16]

> SergP

для того чтобы избавиться от вынужденной обработки отказа в App.OnException, необходимо явно св-ва Address и Port (т.е. явный IP-адрес и явный номер порта), оставляя св-ва Host и Service пустыми

в этом случае не будут задействованы службы, разрешающие имя хоста в его адрес и имя сервиса в номер соотв.порта

как раз эти службы, будучи задействованными при неуказании явно адреса и порта, вызывают внутри компонента ф-ции [WSAAsync]GetHostByName (хост -> адрес) и [WSAASync]GetServByName (имя сервиса -> номер порта) ... именно эти ф-ции генерируют отказ с упомянутым кодом, и отказ этот обрабатывается компонентом столь нецдобно, по твоему мнению.

есть другие варианты - работать либо с блок.гнездом (тогда исключения во всех методах компонента "ловятся" банальным try..except) либо работать с неблок.гнездом, но указывать адрес+порт явно, проводя перед коннектом разрешение имен самостоятельно явными вызовами вышеупомянутых Winsock-ф-ций.


 
nikkie ©   (2003-10-02 13:46) [17]

что ж, значит, в D5 действительно нужен лом. а в D6 код такой:
procedure TCustomWinSocket.CMLookupComplete(var Message: TCMLookupComplete);
var
ErrorCode: Integer;
begin
if Message.LookupHandle = FLookupHandle then
begin
FLookupHandle := 0;
if Message.AsyncError <> 0 then
begin
ErrorCode := Message.AsyncError;
Error(Self, eeLookup, ErrorCode);
Disconnect(FSocket);
if ErrorCode <> 0 then
raise ESocketError.CreateResFmt(@sWindowsSocketError,
[SysErrorMessage(Message.AsyncError), Message.ASyncError, "ASync Lookup"]);
Exit;
end;
...
end;
end;


 
Digitman ©   (2003-10-02 14:09) [18]


> nikkie


скорее всего это был маленький недосмотр со стороны Борланда

в 6-ке его исправили



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

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

Наверх




Память: 0.52 MB
Время: 0.038 c
6-90052
Anonimus
2003-09-19 11:27
2003.11.27
Передача файла с помощью TServerSocket и TClientSocket


14-90115
val_5
2003-11-03 17:33
2003.11.27
Windows CE


1-89961
TUser
2003-11-17 17:33
2003.11.27
Canvas


3-89740
Ru
2003-11-07 13:01
2003.11.27
А у вас такое бывало?


3-89718
Zai
2003-11-10 10:26
2003.11.27
ClientDataSet в FIBPlus