Форум: "Сети";
Текущий архив: 2008.01.06;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c