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

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

ICS - проблема дисконнекта


DeadMeat ©   (2006-12-22 12:49:00) 

Здравствуйте всем!
Решил освоить 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.

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


umbra   (2006-12-28 13:33:00) [1]

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


DeadMeat   (2006-12-28 10:42:00) [2]

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


DeadMeat   (2006-12-25 18:30:00) [3]

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


DeadMeat   (2006-12-23 16:58:00) [4]

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


Наверх

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