Форум: "Сети";
Текущий архив: 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.042 c