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

Вниз

IdTCPClient / IdTCPServer   Найти похожие ветки 

 
Manulo ©   (2004-01-30 18:08) [0]

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

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

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-30 19:54) [1]

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


 
Rouse_ ©   (2004-01-30 20:57) [2]

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


 
Rouse_ ©   (2004-01-30 21:07) [3]

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


 
Manulo ©   (2004-01-31 12:19) [4]

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


 
Manulo ©   (2004-01-31 12:21) [5]

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


 
Manulo ©   (2004-01-31 14:22) [6]

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


 
Rouse_ ©   (2004-01-31 15:07) [7]

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


 
Manulo ©   (2004-01-31 17:51) [8]

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



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

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

Наверх




Память: 0.49 MB
Время: 0.047 c
1-1082931283
TALLA
2004-04-26 02:14
2004.04.11
использование TChart в DLL, CGI для отображения в памяти


4-1075662722
DelphiN!
2004-02-01 22:12
2004.04.11
Копировать файл


14-1079781354
Труп Васи Доброго
2004-03-20 14:15
2004.04.11
Что с форумом?


4-1079681594
Dmitry-K
2004-03-19 10:33
2004.04.11
Работа с двумя мониторами???


3-1082022725
Capricorn7B
2004-04-15 13:52
2004.04.11
Глюк в компоненте IBDataSet