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

Вниз

Глюк в TSocketConnection и в клиенте (Midas, DCOM)   Найти похожие ветки 

 
maxi ©   (2002-05-08 10:31) [0]

Здрасте. У меня вопрос: есть Сервер приложений и клиентская часть. Вот часть клиента на коннект :

SocketConnection1.Open;
if SocketConnection1.Connected then
begin
MainData :=IRDMZadachdisp(SocketConnection1.GetServer);
.....
end;

Первый раз все происходит нормально, соединение устанавливается, а при попытке вызвать метод интерфейса тоже проблем нет.
Сервер рассылает сообщение о своем закрытии, моя программа отлавливает это сообщение клиетская часть делает disconnect:

SocketConnection1.Close;

Однако, сам клиент не выключается (выключаться не должен), просто должно разрываться соединение. При повторном запуске сервера где то на стороне, я вручную опять делаю коннект (по кнопке) смотри выше, где происходит:
...
MainData :=IRDMZadachdisp(SocketConnection1.GetServer);
...
Т.е. получаю новую ссылку на интерфейс. Однако при попытке вызова метода по новой ссылке , например MainData.MyMethod1(..)
у меня возникает исключение (типа Аксесс по адресу ХХХ денайд). Я нашел в чем проблема : если написать так

if MainData = nil then MainData:=IRDMZadachdisp
(SocketConnection1.GetServer);

то ошибка не возникает и методы проходят нормально. Появляется вопрос : Почему так ? Разве новая ссылка на интерфейс корявая ? Если да то почему ? Или надо до разрыва соединения уничтожать старую ссылку на интерфейс ? Тогда как ?
Посоветуйте ....


 
Digitman ©   (2002-05-08 10:54) [1]

Не вдаваясь в подробности порекомендую самый простой вариант :

1. Коннект к удаленному MIDAS-AppServer"у

MainData :=IRDMZadachdisp(SocketConnection1.GetServer);

при выполнении строчки сначала происходит автоматическая попытка транспортного коннекта (неявный Open-метод) по заданным RemoteAddress/RemoteHostName/RemotePort, и , в случае успешного коннекта, запрашивается указанный интерфейс. В случае отказа транспортного коннекта либо отказа сервера в запрошенном интерфейсе произойдет исключение, фиксирующее факт невозможности получить доступ к IAppServer

2. Дисконнект

MainData := nil;

при выполнении строчки сначала происходит разрыв связи с удаленным IAppServer-объектом (сервер выгружает интерфейсный объект по инициативе клиента), затем - разрыв транспортного коннекта (неявный Close-метод)

P.S. Исключения, возбуждаемые TSocketConnection (относящиеся к гнездовому транспорту как таковому), асинхронны !







 
maxi ©   (2002-05-08 11:09) [2]

Спасибо большое.
Только вопрос : означает ли операция MainData := Nil , что мы убираем ссылку на объект ? И означает ли, что в ваших случаях нет необходимости делать прямой Open или Close ?


 
Romkin ©   (2002-05-08 11:48) [3]

MainData :=IRDMZadachdisp(SocketConnection1.GetServer);
Все дело в том, что при присвоении переменной-интерфейсу сразу вызывается MainData._AddRef, причем неявно
при новом присвоении компилятор делает проверку
if assigned(MainData) then MainData._Release;
Поскольку объекта уже нет, идет AV
Перед SocketConnection1.Close; (или на beforeDisconnect)
сделай MainData := nil,
если соединение уже разорвано, то pointer(MainData) := nil ; - здесь release не вызовется



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

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

Наверх




Память: 0.48 MB
Время: 0.015 c
14-58262
blackweber
2002-06-16 15:23
2002.07.18
Текила


1-58124
CA
2002-07-08 23:21
2002.07.18
ShortCut


14-58284
Программер без тестеров
2002-06-21 10:51
2002.07.18
Программы для тестирования софта


1-58225
ricks
2002-07-07 21:16
2002.07.18
Поворот картинки.


3-57931
daun
2002-06-25 12:30
2002.07.18
ADO+Access