Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Вниз

TClientSocket+ClientSocket.Open=Непростой вопрос 


hacker   (2002-01-04 07:26) [0]

Проблема такая: При Open как и полагается возникает исключение, а не OnError, НО метод, описанный в статье "Программирование сокетов в Дельфи" : Кариха Николая с заключением Open в Try Except не работает, т.к. у меня после открытия возникает первым делом событие OnDisconnect и после него исключение. Так как ловить это исключение?



hacker   (2002-01-04 10:02) [1]

И все же кто знает?



panov   (2002-01-04 11:02) [2]

Приводи код.



hacker   (2002-01-04 11:24) [3]

Не знаю какое место ты спрашиваешь, это метод моего коннекта(просто в его потомок добавил), хотя такое было и при простом TClientSocket
Ситуация такая: Dial-Up вырублен, по идее это описанная ситуация.

После этого Open"a в часть Except не заходит,а продолжается выполнение как обычно и первым делом возникает Ondisconnect, после исключение ESocketError - "Windows Socket error: этот хост не известен (11001), on API" ASync Lookup"
а если коннект есть то идет как надо - OnConnect

procedure TMyClientSocket.MyConnect(URL: String);
Var sHost, sName: String;
begin
Div_URL(URL, sHost, sName);
Host:=sHost;
HeaderBuf.Add(CurrMethod+" "+sName+" HTTP/1.1");
HeaderBuf.Add("Host: "+sHost);
HeaderBuf.Add("Accept: */*");
HeaderBuf.Add("Referer: http://"+sHost);
// HeaderBuf.Add("Proxy-Connection: Keep-Alive");
If CurrMethod="GET"
then
begin
HeaderBuf.Add("Range: bytes="+IntToStr(BodyRange)+"-");
end;
HeaderBuf.Add("Pragma: no-cache");
HeaderBuf.Add("Cache-Control: no-cache");
HeaderBuf.Add("Connection: close");
HeaderBuf.Add("");
Try
Open;
Except
Здесь чего-нибудь
end;



hacker   (2002-01-04 13:13) [4]

Код привел,а реплики не слышу..



Hacker   (2002-01-04 20:08) [5]

Кто-нибудь, помогите



Hacker   (2002-01-05 14:33) [6]

М.. Чего все молчат..



panov   (2002-01-06 23:27) [7]

Ошибку тебе все-таки придется обрабатывать в OnError.
Если тебе нужно заново пытаться открыть сокет,
то в OnError пишешь:

ErrorCode := 0; //или обрабатываешь ошибку
ClientSocket.Open;



Hacker   (2002-01-07 20:56) [8]

Как никто понять не может, что этот самый OnError не возникает вообще - читайте с начала вопроса



panov   (2002-01-07 21:21) [9]

Уже говорили обэтом.
Отключи свойство Break On Exception в Delphi.
В OnError ErrorCode := 0;

Exception не возникнет.



Hacker   (2002-01-10 10:35) [10]

К сожалению,я не нашел свойство Break On Exception(забыл совсем), но зато я нашел в чем глюк - это TCustomWinSocket виноват - не может нормально сам обработать сообщение о LookUp"e(в прочем моих знаний не хватило чтобы ее понять - как это вместо then вызывается Disconnect - ???)
Решение тривиальное - делать в Delphi 6 - там ошибку исправили.



vlad__   (2002-01-10 21:05) [11]

Async lookup будет выпадать в любом случае - хоть в ОнЕррор Еррор:=0 хоть в try except. Так уж это у борланда сделано, они не пытаются даже вызывать OnError. А отловить можно через Application.OnException.



panov   (2002-01-11 07:23) [12]

>vlad__ (10.01.02 21:05)

А ты попробуй.
У меня не выпадает Exception.



ThaDrot   (2002-01-11 14:32) [13]

У меня та же проблема с сокетами...
Но в onError при исключении я попадаю. Вопрос :
как сделать так, что-бы после того как я обработал ошибку
в onError среда Delphi не выдавала ошибку ?



Vlad____   (2002-01-12 01:48) [14]

>panov ©

А вот именно и пробовал, пока не посмотрел исходники сокета. Хотя возможно, что в каком-то из сервиспаков это и пофиксено ( У меня делфи 5 без апдейтов ) а вот и причина ( ScktComp.pas )

procedure TCustomWinSocket.CMLookupComplete(var Message: TCMLookupComplete);
begin
if Message.LookupHandle = FLookupHandle then
begin
FLookupHandle := 0;
if Message.AsyncError <> 0 then
begin
Disconnect(FSocket); // в случае ошибки сразу вываливается соответствующее сообщение а так-как это реакция на мессадж то try except не помогают
raise ESocketError.CreateResFmt(@sWindowsSocketError,
[SysErrorMessage(Message.AsyncError), Message.ASyncError, "ASync Lookup"]);
end;
//---- сдесь код для все ок ---------
end;



Hacker   (2002-01-12 05:58) [15]

Я переконапатил другом метод ResultCheckSicket(точно не помню, но там же в начале юнита). В Делфи 6 . И убрал там Raise. Они обработчик, который там проверяется не присваивают вроде.

И все хорошо, пока



Wizard_Ex   (2002-01-12 13:30) [16]

А если не конопатить юнит, то можно так
Кинь компонент Application Event и в событии OnExepction
напиши типа
if E is ESocketError then ничего не делать

Должно помочь




Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.024 c
6-80645           star                  2002-01-04 12:54  2002.03.25  
Как уловить момент подключения компьютера к интернету


1-80465           Starkom               2002-03-12 09:55  2002.03.25  
Как программно раскрыть выпадающий список в TComboBox?


1-80576           Nic                   2002-03-10 12:59  2002.03.25  
TStringGrid


3-80453           -=Stas=-              2002-02-28 10:05  2002.03.25  
Выход из триггера в IB


14-80684          Digitman              2002-02-11 16:26  2002.03.25  
А не запихнуть ли и мне ? :)