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

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

IdTCPClient / IdTCPServer [D6, Win2k]


Manulo ©   (2004-01-30 18:08:00) 

Есть сетевое приложение, состоящее из программы-клиента и программы-сервера:

Со стороны сервера

procedure TForm1.ping_timerTimer(Sender: TObject);
begin
 ping_client.Host:=get_ip;
 ping_client.BeginWork(wmWrite,1000);
end;



procedure TForm1.ping_clientWorkBegin(Sender: TObject;
 AWorkMode: TWorkMode; const AWorkCountMax: Integer);
var i : integer;
   s : string;
begin
 try
   ping_client.Connect;
   ping_client.WriteLn('ping');
   s:=ping_client.ReadLn;
   ping_client.Disconnect;
//
   Label22.Caption:=s;
//
   ping_client.EndWork(wmWrite);
 except
   Memo1.Text:=Memo1.Text+'ERROR!';
   ping_client.EndWork(wmWrite);
 end;
end;


Со стороны клиента
procedure TForm1.ping_servExecute(AThread: TIdPeerThread);
var s : string;
begin
 s:=IntToStr(info.time_left)+'!'+IntToStr(info.Time);
 AThread.Connection.WriteLn(s);
 AThread.Connection.Disconnect;
end;


Проблема вот в чём, эта система работает от силы часа два, три (пинг идёт ежесекундный), потом по непонятным причинам сервер прекращает посылать сообщения. Помагает только перегрузка приложение-сервера :( Вот, собственно, вопрос, как это исправить?


Manulo   (2004-01-31 17:51:00) [1]

Тут проблемка. Я не смог нормально различить различные соеденения :( Допустим есть комп№1 им комп №2. как посласть сообщение конкретному компу? И как конкретно от него получить ответ, тьочнее как распознать, что от него?


Rouse_   (2004-01-31 15:07:00) [2]

А для чего ты постоянно дисконнект делаешь? Соединяешь все клиенты с сервером и все... и отправляй данные в открытое соединение без разрыва. Можно даже не отправлять, просто проверять на наличие соединения.
ИМХО велосипед изобретаешь...


Manulo   (2004-01-31 14:22:00) [3]

Методом тестов установил, что перестаёт выполнятся процедура TForm1.ping_clientWorkBeginв коде клиента (первой строкой процедуры прописал вывод на лейбочку текущего времени).


Manulo   (2004-01-31 12:21:00) [4]

Есть ещё варианты, почему глюк возникает... Возможно при каждом новом подключении сервер затребывает новый номер сокета, и в конце концов свободные сокеты заканчиваются.
Возникает вопрос, как заставить idTCPClient не открывать сокет с новым номером, а использовать постоянный номер сокета, то есть как этот номер жёстко задать?


Manulo   (2004-01-31 12:19:00) [5]

Задача простая: Есть N машин, находяшихся в одной сетке. Сервер постоянно сканирует эти машины, то есть каждую секунду подключается к следующей по списку машине, и "пингует" её по определённому порту, точнее даже не её, а программу-клиента, которая в ответ на пинг высылает некоторые быстроменяющиеся переменные. Кроме того, необходимо постоянно иметь данные о том, запушена ли на удалённом компе программа клиент. Лутшего выхода, как постоянная пропинговка, я пока не нашёл


Rouse_   (2004-01-30 21:07:00) [6]

Да и не пинг это по существу, а обмен сообщениями, подтверждающий наличие приемника получателя...


Rouse_   (2004-01-30 20:57:00) [7]

Для чего нужен ежесекундный пинг? Для определения, не отвалился ли сервер? Не проще установить TCP соединение?


Manulo   (2004-01-30 19:54:00) [8]

Хорошо, дополним вопрос. Может ли в этом глюке участвовать буфер? Точнее такая вредная привычка, как его переполнение? Если да, то как избавиться от такой вредной привычки?


Наверх

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