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

Вниз

Socket   Найти похожие ветки 

 
Копосов Н.В.   (2003-11-03 09:45) [0]

Уважаемые мастера! У меня снова вопрос по socket: как мне грамотно обрабатывать ошибки на клиенте, я указываю хост на сервер, а сервер на капремонте(выключен), одним словом как грамотно и в какой процедуре обрабатывать ошибки при соединении.


 
Digitman ©   (2003-11-03 09:58) [1]


> вопрос по socket


по какому "socket" ? что в твоем понимании есть "socket" ?


 
Копосов Н.В.   (2003-11-03 10:20) [2]

>по какому "socket" ? что в твоем понимании есть "socket" ?
Вопрос не посуществу!


 
Fay   (2003-11-03 10:29) [3]

Не вполне понятен вопрос. Приведите пример безграмотной обработки, pls.


 
Polevi ©   (2003-11-03 10:30) [4]

это точно


 
Digitman ©   (2003-11-03 10:35) [5]


> Копосов Н.В


Да что ты говоришь ?! Да неужто ?!

У меня вот, к примеру, есть некий мной написанный класс TMySocketClass = class(TMyAbstractSocket), и у него есть событие OnSocketFailure(), и в обработчике этого события я пишу Sender.CloseConnection.

И это у меня, представь себе, тоже "сокет" !!! И попробуй сказать, что это не так)))... И попробуй спросить, почему, мол, у меня в палитре компонентов нет этого самого "сокета")))


 
Копосов Н.В.   (2003-11-03 12:26) [6]

Открываю сокет
ClientSocket1.open;
а сервер может вообще быть не запущен
и у меня пошли ошибки, номера не помню (~10054 - вроде)мол сервера нет, дак вот эти самые ошибки мне не нужны. Посоветуйте плиз. Может сработать на исключения ошибки, т.е.
try
finally
end;
или
try
except
end;


 
Копосов Н.В.   (2003-11-03 12:30) [7]

Digitman, я понимаю что ты разбираешься лудше других, но ты спустись на землю, если сможешь помоги


 
Digitman ©   (2003-11-03 12:59) [8]

ClientSocket1.ClientType := ctBlocking;
try
ClientSocket1.open;
except
..ашипка ..
end;


 
Копосов Н.В.   (2003-11-03 14:17) [9]

Спасибо Digitman, но если не достал объясни зачем ClientSocket1.ClientType := ctBlocking;


 
Копосов Н.В.   (2003-11-03 14:32) [10]

Да, пишу всё это прямо на обработчик кнопки

ClientSocket1.ClientType := ctBlocking;
try
ClientSocket1.open;
except
..ашипка ..
end;

Но только не помогает ошибка сокета(10064). Я так понимаю, что надо вместо ..ашипка .. писть что-то грамотнее, помоги если не достал


 
Digitman ©   (2003-11-03 14:34) [11]

потому что по умолчанию ClientType = ctNonBlocking, и выполнение метода Open в этом режиме приведет к старту асинхронной операции коннекта, после чего метод Open немедленно возвратит управление вызывающему коду. Возвращение управления без возникновения исключения не означает факт установления коннекта либо факт невозможности установления оного.

О факте успешного коннекта компонент известит событием OnConnect

О факте готовности гнезда к передаче данных серверу (как минимум, после успешного коннекта, т.е. вслед за событием OnConnect) компонент известит событием OnWrite

О факте НЕуспешного коннекта компонент известит событием OnError, параметр ErrorCode в обработчике которого укажет на причину отказа. Здесь же, в обработчике OnError, по результатам "собственноручноно" анализа кода причины отказа предпринять последующие действия, зависящие от причины отказа и твоей собственной логики действий в случае той или иной причины.


 
Копосов Н.В.   (2003-11-03 14:36) [12]

извинbте 10061


 
Digitman ©   (2003-11-03 14:38) [13]


> Но только не помогает ошибка сокета(10064). Я так понимаю,
> что надо вместо ..ашипка .. писть что-то грамотнее


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


 
Копосов Н.В.   (2003-11-03 14:45) [14]

Нет алгоритмы мне не надо, пишу в
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
exit;
end;
тобишь ваще не реагировать на ошибки, а ему по барабану.


 
Digitman ©   (2003-11-03 15:10) [15]

клавишу F1 знаешь ?

если не знаешь, то поставь курсор мыши на поле инспектора объектов, в котором назначается обработчик данного события, найди на клавиатуре F1, надави ее и увидишь :

Occurs when the socket fails in making, using, or shutting down a connection.

property OnError: TSocketErrorEvent;

Description

Write an OnError event handler to respond to errors that arise with the socket connection. Set the ErrorCode parameter to 0 if the OnError event handler successfully deals with the error condition, to prevent an ESocketError from being raised.

не для Пушкина, между прочем, писано)

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


> Нет алгоритмы мне не надо


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


 
Копосов Н.В.   (2003-11-03 15:37) [16]

Увидел это
ErroCode := 0;
Socket.Close;
подумал ты гений, но ошибка не изчезла


 
Копосов Н.В.   (2003-11-03 15:43) [17]

Знаю что ты за Delphi сидишь, глянь

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket2.ClientType := ctBlocking;
ClientSocket2.Address:="127.0.0.1";
ClientSocket2.port:=5555;
try
ClientSocket2.open;
except
form1.Caption:="no";
end;
end;

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

эту ошибку моно как нить остановить!?


 
Копосов Н.В.   (2003-11-03 15:48) [18]

ты гений у меня всё решилось


 
Digitman ©   (2003-11-03 15:51) [19]

не выдумывай

этот код

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket2.ClientType := ctBlocking;
ClientSocket2.Address:="127.0.0.1";
ClientSocket2.port:=5555;
try
ClientSocket2.open;
except
form1.Caption:="no";
end;
end;

не может не обрабатывать исключения, возникающие при Open (т.е. именно ошибки коннекта).
и никаких OnError не нужно.


 
Копосов Н.В.   (2003-11-03 17:19) [20]

бр-р-р-р не понял, поясни
>>не может не обрабатывать исключения, возникающие при Open (т.е. >>именно ошибки коннекта).
>>и никаких OnError не нужно.

Это меня смутило, с верхним кодом всё пахало.


 
Копосов Н.В.   (2003-11-03 17:23) [21]

может так:
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket2.ClientType := ctBlocking;
ClientSocket2.Address:="127.0.0.1";
ClientSocket2.port:=5555;
try
ClientSocket2.open;
except
form1.Caption:="ошибка соединения";
ClientSocket2.Close;
end;
end;


 
Digitman ©   (2003-11-03 17:26) [22]


> может так:


работает ? значит - так


 
Копосов Н.В.   (2003-11-03 17:32) [23]

да ты руль, билися мы с тобой весь день, но чего хотели добились :-)


 
Digitman ©   (2003-11-03 17:54) [24]

).. а завтра ты спросишь, почему, мол, "прога виснет", пока коннект идет))))))))))


 
Копосов Н.В.   (2003-11-08 13:21) [25]

>>).. а завтра ты спросишь, почему, мол, "прога виснет", пока >>коннект идет))))))))))

Что надо в отдельный поток загонять


 
Digitman ©   (2003-11-08 13:35) [26]


> Копосов Н.В.


совершенно необязательно


 
Копосов Н.В.   (2003-11-08 14:00) [27]

Дело в том что я с такой проблемой не столкнулся, но так на будущее...интересовался



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

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

Наверх




Память: 0.53 MB
Время: 0.029 c
14-25560
Kein
2003-12-19 20:45
2004.01.09
Access


6-25476
Anarki
2003-11-07 23:58
2004.01.09
Проблема с idSMTP


14-25586
SergP
2003-12-17 22:56
2004.01.09
Как на PHP определить IP клиента?


1-25373
Indy
2003-12-25 04:45
2004.01.09
Документация по Indy


3-25198
My
2003-12-11 17:51
2004.01.09
Вставка множества записей