Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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 ничего не делать

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



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

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

Наверх





Память: 0.48 MB
Время: 0.005 c
1-80476
fag2000@ok.ru
2002-03-12 11:52
2002.03.25
Как отлаживать DLL?


3-80413
Сява
2002-02-26 15:27
2002.03.25
Как создать БД в IB


1-80511
GAMOON
2002-03-12 19:48
2002.03.25
Как с имитировать жидко кристалический экран как на мобильгых телефонах?


3-80435
Antony
2002-02-27 12:14
2002.03.25
TQuery.Prepare, сильные утечки памяти


3-80390
Malder
2002-02-20 21:25
2002.03.25
Как управлять записями пользователей в Firebrid





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский