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

Вниз

ICS - проблема дисконнекта   Найти похожие ветки 

 
DeadMeat ©   (2006-12-22 12:49) [0]

Здравствуйте всем!
Решил освоить ICS. Вроде не плохо. Но вот появилась странная проблема. Никак не пойму. Надо написать программку, в которой будет постоянно отслеживаться состояние соединения с сервером. Т.е. должны быть учтены варианты с резким выключением компьютера или выдергиванием сетевого кабеля. Раньше делал с помощью постоянного посылания команды (текстовой) PING и приемки команды PONG. Был свой таймер и в случае отсутствия приема определенное время считалось, что соединения больше нет. Все работает. Но вот захотелось мне попробовать сделать это чуток по другому. Все на том же ICS, на котором и делал.
Так вот.
В DataModul"е (TdmNetData) создаю клиента:

.....
 
 cln := TnetClient.Create(nil);
 with cln do
   begin
     DisplayName := "Local"; // принадлежит классу TnetClient
     DisplayStatus := "Откл."; // принадлежит классу TnetClient
     Connected := false; // принадлежит классу TnetClient
     HostIP := "192.168.1.2"; // принадлежит классу TnetClient
     HostPort := "1973"; // принадлежит классу TnetClient

     Addr := HostIP;
     Port := HostPort;
     Proto := "tcp";

     OnError := WSocketError;
     OnBgException := WSocketBgException;
     OnSessionAvailable := WSocketSessionAvailable;
     OnSessionClosed := WSocketSessionClosed;
     OnSessionConnected := WSocketSessionConnected;
   end;

 with netTimer do
   begin
     Enabled := true;
   end;

.....

type
 TnetClient = class(TWSocketClient)
   public
     DisplayName: string;
     DisplayStatus: string;
     DisplayDesc: string;
     Connected: boolean;

     HostIP: string;
     HostPort: string;
   end;

.....
 
 with cln do
   begin
     if not Connected then
       begin
         Close;
         Addr := HostIP;
         Port := HostPort;
         Proto := "tcp";
         Connect;
         DisplayStatus := "Откл.";
       end
         else
           begin
             DisplayStatus := "Вкл.";
           end;
   end;

.....

procedure TdmNetData.WSocketBgException(Sender: TObject; E: Exception;
 var CanClose: Boolean);
begin
 frmMain.ListBox1.Items.Add("WSocketBgException..."); //для отслеживания (временно)
 with cln do
   Connected := false;
end;

procedure TdmNetData.WSocketError(Sender: TObject);
begin
 frmMain.ListBox1.Items.Add("WSocketError..."); //для отслеживания (временно)
 with cln do
   Connected := false;
end;

procedure TdmNetData.WSocketSessionAvailable(Sender: TObject; ErrCode: Word);
begin
 frmMain.ListBox1.Items.Add("WSocketSessionAvailable - " + IntToStr(ErrCode)); //для отслеживания (временно)
 with cln do
   if ErrCode = 0 then
     begin
       Connected := true;
     end
       else
         begin
           Connected := false;
         end;
end;

procedure TdmNetData.WSocketSessionClosed(Sender: TObject; ErrCode: Word);
begin
 frmMain.ListBox1.Items.Add("WSocketSessionClosed - " + IntToStr(ErrCode)); //для отслеживания (временно)
 with cln do
   begin
     Connected := false;
   end;
end;

procedure TdmNetData.WSocketSessionConnected(Sender: TObject; ErrCode: Word);
begin
 frmMain.ListBox1.Items.Add("WSocketSessionConnected - " + IntToStr(ErrCode)); //для отслеживания (временно)
 with cln do
   if ErrCode = 0 then
     begin
       Connected := true;
     end
       else
         begin
           Connected := false;
         end;
end;


Сервер создан в дизайнтайм и основан на TWSocketServer.
Собсна проблема вот в чем. Запускаю клиента. Запускаю сервер. Клиент подключается к серверу. Закрываю сервер. Клиент все еще "думает", что он подключен. Т.е. событие OnClose и иже с ним не приходят. А вот если запустить в начале сервер, а потом клиент и закрыть сервер, то все проходит нормально. Клиент "видит", что коннекта больше нет. И события приходят как надо. А вот если наоборот, то никак.
Версия v6 последняя с сайта. Вроде ноябрьская. Использую в BDS2006.

ЗЫ. Вроде как если клиента полностью оформить в дизайн тайм, то он все подключения и отключения видит прекрасно. А вот в рантайм - вот такая ошибка. В чем может быть дело? Глюк или я чего то не понимаю? В дизайн тайме все тоже самое - работает прекрасно. В ран тайме - никак.


 
DeadMeat ©   (2006-12-23 16:58) [1]

Неужели никто с таким поведением этих компонент не сталкивался?


 
DeadMeat ©   (2006-12-25 18:30) [2]

Я конечно извеняюсь за флуд, но все же никто не знает?


 
DeadMeat ©   (2006-12-28 10:42) [3]

Ну хотя бы в мой день рождения, кто-нибудь сможет помочь? ))


 
umbra ©   (2006-12-28 13:33) [4]

нужен спец по ICS. Если в дизайн-тайме все работает, то можно посмотреть в исходники конструктора клиента. Может там свойство какое-нибудь устанавливается (таймаут какой-нибудь). К тому же непонятно, как отслеживается наличие коннекта



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

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

Наверх





Память: 0.47 MB
Время: 0.04 c
2-1183964332
vitv
2007-07-09 10:58
2007.08.05
Вызов функции из юнита.


2-1184075846
Knob
2007-07-10 17:57
2007.08.05
Отрезок изображения


15-1184235201
ArtemESC
2007-07-12 14:13
2007.08.05
Новые веяния в играх...


15-1183670344
Плохиш
2007-07-06 01:19
2007.08.05
И нас ещё называют злыми


15-1183981766
Pashok
2007-07-09 15:49
2007.08.05
заблокирован DVD привод (Lite-on DVDRW SHM-165 P6S)





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