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