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

Вниз

Событие OnDisconnect   Найти похожие ветки 

 
Dimich1978 ©   (2002-08-26 11:43) [0]

Я как понял это событие происходит один раз и по вине самого приложения или по вине сервера(дисконнект вообщем). Но вот вопрос если у меня рухнул сервер (подвис сам, или винда) что привело к перезагрузке компа. ТО клиент должен подконнектится сам после того как сервер заново запустится. Как это можно реализовать.


 
AlexAn ©   (2002-08-26 13:18) [1]

в этом случае произойдет тот-же дисконнект (это сделанно на уровне систеиы), все, что надо это переодически (например по таймеру) проверять доступность сервера и пытаться с ним соединиться.


 
Dimich1978 ©   (2002-08-27 08:59) [2]

Да я пытаюсь по таймеру подконнектится, но я не пойму как проверить доступность сервера, т.е. я что делаю. Я если связи нет, пытаюсь просто выполнить заново коннект т.к. уже знаю что связь разорвана, но у меня заново связь не восстанавливается( и именно когда отрубается сервер). Если можно отрывок кода как проверить доступность сервера?. Заранее благодарен.


 
Dimich1978 ©   (2002-08-27 09:02) [3]

А это код на дисконнект
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
RegIni:tregistry;
begin
cooltrayicon1.IconIndex:=1;
cooltrayicon1.Hint:="Cвязь разована";
{RegIni:=TRegIniFile.Create;
RegIni.RootKey:=HKEY_CURRENT_USER;
RegIni.OpenKey("SOFTWARE",true);
RegIni.OpenKey("AdvSoft",true);
RegIni.OpenKey("CONFIG",true);
IP:=regini.readString("IP");
if regini.ValueExists("Password") then else begin
regIni.WriteString("Password","346444");
end;
if IP<>"" then begin
label2.caption:=GetComputerName;
clientsocket1.Host:=IP;
clientsocket1.Port:=1025;
clientsocket1.open;
label1.caption:="Соединение установлено";
end;
end;



 
AlexAn ©   (2002-08-27 11:28) [4]

отрывок кода очень простой:

procedure Timer1Timer(Sender...
begin
if not ClientSocket1.Active then
ClientSocket1.Active := true;
end;


можно все еще это взять в try except, т.к. вероятно с первого раза не сработает, если сервер доступен, то должно соединиться.


 
Dimich1978 ©   (2002-08-27 13:18) [5]

Пишу , но выдает ошибку типа Asynchronous socket error 10049. После того как я сервер отрубаю и потом заново включаю.


 
AlexAn ©   (2002-08-28 09:29) [6]

Надо взять в try его:

procedure Timer1Timer(Sender...
begin
try
if not ClientSocket1.Active then
ClientSocket1.Active := true;
except
end;
end;




 
Dimich1978 ©   (2002-08-28 13:46) [7]

Я уже заключал в try except. Но видно это где то глубже. Спасибо за совет. Буду разбираться дальше.


 
VID ©   (2002-08-29 00:21) [8]

TO Dimich 1978:
для начала, в событии Client.onError
напиши :
client.Socket.Disconnect(Socket.SocketHandle);
- одни считают, что это забыли авторы TClientSocket, другие - что эта строчка - обязанность программеров, использующих этот ClienSocket. Как бы то ни было, эта строчка кода должна быть в этом обработчике.

А теперь насчёт реконнекта:
как я понял, ты вызываешь реконнект сразу же при наступлении события ondisconnect. Но лучше делать так:
в событии onError и onDisconnect в нужном месте пишешь:
ReconnectTimer.Enabled := true;


А вот код :
Procedure ReconnectTimerTimer(...);
begin
ReconnectTimer.Enabled := False;
//Читаешь, настройки коннекта клиента (хотя по идее они все сохранены в самом ClientSocket)
If not Client.Active then Client.Open;
end;

Таким образом, задав св-ву Interval объекта ReconnectTimer, ты получишь реконнект через нужное количество секунд.

Однако, ведь есть ещё ситуация, когда :
-Механизм реконнекта, разрешён в программе
-а пользователь вручну отключил клиента (нажал кнопку DISCONNECT)
По идее в этом случае тоже сработает реконнект (ReconnectTimer.Enabled := true, в событии onDisconnect) - хотя по логике не должен

Простым решением проблемы является создание логич. переменной:
VAR AllowAutoReconnect : Boolean = False;

Итак, при нажатии на кнопку DISCONNECT, в коде ДО Client.Close, пишешь AllowAutoReconnect := False;

а в событии Client.onDisconnect меняешь строчку ReconnectTimer.Enabled := True на
ReconnectTimer.Enabled := AllowAutoReconnect;

Теперь пожелания пользователя будут учтены :)


 
VID ©   (2002-08-29 00:26) [9]

Кстати, забыл сказать, что в Client.onConnect где нибудь среди первых строчек кода надо написать AllowAutoReconnect := true. Таким образом состояние механизма реконнекта клиента будет приведено к начальному - т.е. клиент готов включить реконнект, в случае аварийного отключения



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

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

Наверх




Память: 0.49 MB
Время: 0.034 c
6-101410
Olfi
2002-08-23 21:04
2002.10.31
Где искать пароль почты на компе?


3-101096
Vovaka
2002-10-09 15:16
2002.10.31
Знатоки и пользователи Sybase ASE подскажите


4-101599
boa
2002-09-18 09:07
2002.10.31
Сообщение WM_GETFONT


1-101308
bobby
2002-10-19 17:28
2002.10.31
как показать скроллбар в richedit?


14-101492
Николай Быков
2002-10-11 16:11
2002.10.31
Си плюс плюсы