Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];

Вниз

Событие 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
3-101093
Юра
2002-10-09 12:02
2002.10.31
Картинки формата jpg в Paradox


4-101582
d-coder
2002-09-19 23:29
2002.10.31
Получение функций из DLL: каким образом???


3-101089
stur
2002-10-08 14:47
2002.10.31
Как отобразить в DBGrid в виде String поля типа VARCHAR2 (Oracle)


1-101240
Маша
2002-10-22 10:26
2002.10.31
Прошу помощи ...


14-101440
MVova
2002-10-10 11:36
2002.10.31
Почему ICQ а не MSN





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