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

Вниз

idTCPClient 10 в длл - как проверить коннект?   Найти похожие ветки 

 
tytus ©   (2007-04-24 17:07) [0]

Нужно чтобы было только ОДНО подключение к 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;
......
Сервер настроен на одно подключение.
Так вот, если вызвать ф-ю второй раз, то все-таки исключения не происходит, и ф-я выполняется дальше. А сие мне не подходит.
Как мне обеспечить только ОДНО подключение???


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


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

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


 
tytus ©   (2007-04-24 17:12) [2]

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


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


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

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


 
tytus ©   (2007-04-24 17:20) [4]

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


 
umbra ©   (2007-04-24 17:22) [5]


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

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


 
tytus ©   (2007-04-24 17:28) [6]

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


 
DVM ©   (2007-04-24 17:32) [7]

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


 
umbra ©   (2007-04-24 17:48) [8]


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

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


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

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


 
DVM ©   (2007-04-24 17:57) [10]


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

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


 
tytus ©   (2007-04-24 18:07) [11]

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


 
umbra ©   (2007-04-24 18:59) [12]


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

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


 
tytus ©   (2007-04-25 09:51) [13]

>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-25 10:06) [14]

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


 
tytus ©   (2007-04-25 10:09) [15]

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


 
umbra ©   (2007-04-25 10:23) [16]

если же очень хочется, то можно в длл объявить глобальную булевскую переменную и с ее помощью определять, надо ли 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 11:00) [17]

>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] ) - пока что работает как надо.



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

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

Наверх




Память: 0.51 MB
Время: 0.015 c
2-1197230296
alikon1
2007-12-09 22:58
2008.01.06
Как получить данные из таблицы.


2-1197293417
kyn66
2007-12-10 16:30
2008.01.06
Рисование на канве Image


2-1197015502
Zheksik
2007-12-07 11:18
2008.01.06
Можно ли разукрашивать StringGrid в событии отличном от DrawCell?


2-1197368334
Alexandr Malygin
2007-12-11 13:18
2008.01.06
округление


15-1196606871
Lip
2007-12-02 17:47
2008.01.06
ACM турниры и реальные задачи! Какая связь?