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

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

idTCPClient 10 в длл - как проверить коннект? [D7, WinXP]


tytus ©   (2007-04-24 17:07:00) 

Нужно чтобы было только ОДНО подключение к idTCPServer. Из длл-ки вызывается ф-я в которой нужно подключиться к серверу.
function AConn:integer;
var
 AClient:TidTCPClient;
begin
AClient:=TidTCPClient.Create(nil);
AClient.BoundIP:='...';//к примеру -)
AClient.Port:=6000;
AClient.Host:='...'l
try
 AClient.Connect;
except
 Result:=1;
 AClient.Free;
end;
......
Сервер настроен на одно подключение.
Так вот, если вызвать ф-ю второй раз, то все-таки исключения не происходит, и ф-я выполняется дальше. А сие мне не подходит.
Как мне обеспечить только ОДНО подключение???


tytus   (2007-04-25 11:00:00) [1]

>umbra ©   (25.04.07 10:23) [16]
сенкс,
делал ужо так (см. tytus ©   (24.04.07 17:53) [9])
и описывал так же MyBoolean: boolean =False;
но, меня такой вариант не устроил, потому как если вызывающая прога
обрывает длл (тайаут=30 сек) то все херится... или есче что-то, не помню уже, но факт тот, что делал и - не попдошло.
Вот протестировал свой вариант (tytus ©   (25.04.07 09:51) [13] ) - пока что работает как надо.


umbra   (2007-04-25 10:23:00) [2]

если же очень хочется, то можно в длл объявить глобальную булевскую переменную и с ее помощью определять, надо ли cjtlbyznmcz c cthdthjv. Что-то наподобие

var
  TooMuchClients: boolean = False;

procedure AConn;
var
AClient:TidTCPClient;
begin
if TooMuchCLients then
 exit
else
 begin
   AClient:=TidTCPClient.Create(nil);
   AClient.BoundIP:='...';//к примеру -)
   AClient.Port:=6000;
   AClient.Host:='...'l
   try
    AClient.Connect;
    TooMuchClients := True;
   finally
     AClient.Disconnect;
     TooMuchClients := False;
     AClient.Free;
   end;
 end;
end;


tytus   (2007-04-25 10:09:00) [3]

>umbra ©   (25.04.07 10:06) [14]
Согласен, но , имхо, пути пользователя и винды неисповедимы -)


umbra   (2007-04-25 10:06:00) [4]

вообще неясно, зачем весь этот огород. Если сервер настроен на одно подключение, то второго клиента он просто отключит и все. Зачем об этом заботиться клиенту?


tytus   (2007-04-25 09:51:00) [5]

>ALL
Вот кажется решил проблему. Пока что на тесте.
В idTCPClient макс.кол-во коннектов поставил=2.
Добавил в длл-ку вот такую ф-ю:
function Check:integer;
var
 AClient:TidTCPClient;
begin
AClient:=TidTCPClient.Create(nil);
AClient.BoundIP:=GET_LOCALUSER_IP;
AClient.Host:='10.0.1.108';
AClient.Port:=6000;
try
 try
   AClient.Connect;
   AClient.IOHandler.WriteLn('Check');
   Result:=StrToInt(Trim(AClient.IOHandler.ReadLn));//получаем кол-во коннектов
   AClient.IOHandler.WriteLn('Quit');//отключаемся
   AClient.IOHandler.CloseGracefully;
   AClient.Disconnect;
 except
   Result:=-1;
 end;
finally
 AClient.Free;
 AClient:=nil;
end;
end;

//главная функция
function SetCall(Resul:PChar):integer;
var
n:integer;
xxx
begin
n:=Check;
if (n=-1)or(n>1) then
 begin
   Result:=1;
   StrPCopy(Resul,'Server busy');
   Exit;
 end;

Вот так.
На тестовой проге все нормально.
Сейчас переделаю прожект - будем посмотреть -).
P.S.
выскажите свое мнение о сем коде...


umbra   (2007-04-24 18:59:00) [6]


> ежели НЕ моя прога принудительно закрывается

то, по идее, Ваша длл должна выгружаться из памяти.


tytus   (2007-04-24 18:07:00) [7]

<DVM ©   (24.04.07 17:57) [10]
да в том то и проблема, что программа вызывающая ф-ю НЕ моя...
Я эксперементировал с длл-кой с общим полем памяти, в котором (в поле памяти) одна переменная типа boolean. В начале ставлю туда true а в конце false.
Так вот это - работает. Но есть одно большое НО - ежели НЕ моя прога принудительно закрывается (или есче что-то, что не дает мне записать в переменную false) - то плохо. Даже если сервак свободен, то подключится всеравно низзя.


DVM   (2007-04-24 17:57:00) [8]


> Я так думаю, что при новом вызове ф-ии создается и новый
> клиент и новые переменные (DVM ©   (24.04.07 17:32) [7]),
>  так что смысла вводить переменные -нету!

Если все вызовы функции производятся из одной и твоей программы, то проблемы нету - просто отслеживай что и когда ты вызываешь.


tytus   (2007-04-24 17:53:00) [9]

>umbra ©   (24.04.07 17:48) [8]
Ну вот!!! а я о чем!!!
МНЕ НЕ НУЖНО СОЗДАВАТЬ НОВОГО КЛИЕНТА И КОННЕКТ - нужно проверить, существует ли уже коннект или екземпляр клиента!
Я так думаю, что при новом вызове ф-ии создается и новый клиент и новые переменные (DVM ©   (24.04.07 17:32) [7]), так что смысла вводить переменные -нету!


umbra   (2007-04-24 17:48:00) [10]


> исключение - что соединение уже установлено.

кем? при новом вызове создастся новый клиент, у которого соединение не установлено еще :)


DVM   (2007-04-24 17:32:00) [11]

Че то я не понимаю сути проблемы. Ну не вызывайте второй раз эту функцию раз соединение установлено. После установления соединения заведите какую-либо переменную флаг в которой отметить можно было бы факт подключения.


tytus   (2007-04-24 17:28:00) [12]

>umbra ©   (24.04.07 17:22) [5]
исключение - что соединение уже установлено.
Попробуйте соединится один раз (по клику кнопки - к прим.) а затем кликнуть есче раз...


umbra   (2007-04-24 17:22:00) [13]


> о все-таки исключения не происходит, и ф-я выполняется дальше.

а какое исключение должно, по Вашему, произойти?


tytus   (2007-04-24 17:20:00) [14]

>DVM ©   (24.04.07 17:15) [3]
Server.MaxConnection:=1;
Server.ListenQueue:=0;
смысл мудрения- если уже один раз ф-я вызвалась, создался объект клиента и установилось соединение, то что будет ежели во время коннекта ф-я вызывается есче раз?


DVM   (2007-04-24 17:15:00) [15]


> кнопки нету - ф-ю візівает другая программка....

Если на сервере стоит ограничение на число коннектов, то зачем еще мудрить на клиенте. Лишние клиенты просто не смогут подключиться.


tytus   (2007-04-24 17:12:00) [16]

>DVM ©   (24.04.07 17:09) [1]
кнопки нету - ф-ю візівает другая программка....


DVM   (2007-04-24 17:09:00) [17]


> Как мне обеспечить только ОДНО подключение???

Не давать юзеру нажать кнопку второй раз. Выключить кнопку после коннекта и не включать до дисконнекта.


Наверх

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