Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Socket [D6, Win2k, WinXP]


Страницы:   1 2

Копосов Н.В. ©   (2003-11-03 09:45:00) 

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


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

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


Digitman   (2003-11-08 13:35:00) [2]


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


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


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

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

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


Digitman   (2003-11-03 17:54:00) [4]

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


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

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


Digitman   (2003-11-03 17:26:00) [6]


> может так:


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


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

может так:
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;


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

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

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


Digitman   (2003-11-03 15:51:00) [9]

не выдумывай

этот код

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 15:48:00) [10]

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


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

Знаю что ты за 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:37:00) [12]

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


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

клавишу 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 14:45:00) [14]

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


Digitman   (2003-11-03 14:38:00) [15]


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


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


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

извинbте 10061


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

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

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

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

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


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

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

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

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


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

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


Digitman   (2003-11-03 12:59:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо