Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
2-1197041577
smartleds
2007-12-07 18:32
2008.01.06
Подскажите плз как убрать выделение ячейки у StringGrid


2-1197224693
slavon
2007-12-09 21:24
2008.01.06
Создание массива компонентов в real-time


4-1181989365
cosinus
2007-06-16 14:22
2008.01.06
Как с помощью WinAPI расшарить папку на удаленном компе?


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


6-1177420044
tytus
2007-04-24 17:07
2008.01.06
idTCPClient 10 в длл - как проверить коннект?





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