![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]
> Как мне обеспечить только ОДНО подключение???
Не давать юзеру нажать кнопку второй раз. Выключить кнопку после коннекта и не включать до дисконнекта.