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

Вниз

Глюк в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.008 c
1-58149
amochkin
2002-07-05 14:25
2002.07.18
Создание Polygon из динамического массива точек.


6-58239
Duncan
2002-05-06 23:54
2002.07.18
Обсчет трафика


1-58196
Дмитрий Иванов
2002-07-04 20:33
2002.07.18
StringGrid


3-57981
ASK
2002-06-26 11:35
2002.07.18
В DBLookupComboBox строку из 2-х столбцов таблицы


6-58252
maxi
2002-05-08 10:31
2002.07.18
Глюк в TSocketConnection и в клиенте (Midas, DCOM)





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