Форум: "Начинающим";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];
Внизкак правельно работатать с indy Найти похожие ветки
← →
Costia (2008-02-08 17:56) [0]Уважаемые мастера помогите решить проблему так как самостоятельно не получается .
две программы общающиеся между собой по средствам компонента indy сервер работает на PDA, клиент на PC /
на PDA архитектура процессора arm операционка на платформе WinCe/ програмлю на Lazarus и использую версию компонента 10.2.0.1
Автор: Chad Z. Hower (Kudzu) and the Indy Pit Crew - http://www.indyproject.org/
############# использую вот такой код : #############################################
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
i:integer;
begin
if acontext.Connection.IOHandler.Readable then
readmessage.Add(acontext.Connection.IOHandler.ReadLn);
i:=0;
while i < sendmessage.count do
begin
acontext.Connection.IOHandler.WriteLn(sendmessage.Strings[0]);
sendmessage.Delete(0);
i:=i+1;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i,i2:integer;
begin
i:=0;
while i<readmessage.count do
begin
i2:=0;
while i2<fdmlist.count do
begin
if readmessage.strings[i]=fdmlist.Strings[i2] then
begin
sendmessage.Add(readmessage.Strings[i]);
readmessage.Delete(i); i:=i-1; break;
end;
i2:=i2+1;
end;
i:=i+1;
end;
i:=0 ;
while i<readmessage.Count do
begin
messages(readmessage.Strings[0]);
fdmlist.Add(readmessage.strings[0]);
readmessage.Delete(0);
i:=1+1;
end;
end;
======================================================
P.S function messages(s:string); выполняет действия по команде:
сама логика эстого способа такова: что когда появляется команда ей приклеивается номер и клиент добавляет её в список который в цикле постоянно отправляется на сервер а удаляется из списка тока если сервер отошлет её обратно .на сервере как только команда приходить её с равнивают со списком уже прешедших и если она дубл то отправляют обратно если нет то function message & список пришедших(FDMlist)
зачем использую такой долбанутый способ передачи ? использовал классический и команды пропадали в глубинах WI FI.
=============================================================
клиент пишу на Delphi 7 с родными компонентами
проблема заключается в том что сервер теряет команды и самое фиговое что теряет он их не на всегда / они всплывают заместо следущего сообщени . вот что выдает мониторинг на клиенте :
tcp1 otpravil 1+gong
tcp1 otpravil 1+gong
tcp1 otpravil 1+gong
tcp1 otpravil 1+gong
tcp1 prin9l 1+gong
tcp1 otpravil 2+gong
tcp1 otpravil 2+gong
tcp1 prin9l 1+gong
tcp1 otpravil 2+gong
tcp1 prin9l 1+gong
tcp1 otpravil 2+gong
tcp1 prin9l 2+gong
tcp1 prin9l 2+gong
tcp1 otpravil 3+gong
tcp1 otpravil 3+gong
tcp1 prin9l 2+gong
tcp1 otpravil 3+gong
tcp1 prin9l 3+gong
Извеняюсь за манеру письма . Подскажите пожалуйста как правельно решаются такие задачи ?
← →
Costia (2008-02-08 18:04) [1]да и забыл сказать . можно былобы конечно это проигнорировать , все ровно этот панковский код работает но дело в том что проблемма прогресирует и после 30 команд эфекта надо ждать по 5 сек
← →
sniknik © (2008-02-08 18:06) [2]http://delphimaster.net/view/6-1189799328/
← →
Costia (2008-02-08 18:22) [3]sniknik
спасиб за наводку но я навечек и струдом понимаю к чему вы там пришли .
можеш подсказать что именно надо изменить а точнее где в компоненте надо исправить ошибку и как это делается .
← →
Costia (2008-02-08 18:36) [4]а это есть компонент для инди
procedure TIdUDPListenerThread.Run;
var
PeerIP: string;
PeerPort : TIdPort;
ByteCount: Integer;
begin
if FBinding.Select(AcceptWait) then try
// Doublecheck to see if we"ve been stopped
// Depending on timing - may not reach here if it is in ancestor run when thread is stopped
if not Stopped then begin
SetLength(FBuffer, FServer.BufferSize);
ByteCount := GStack.ReceiveFrom(FBinding.Handle, FBuffer, PeerIP, PeerPort, FBinding.IPVersion);
SetLength(FBuffer, ByteCount);
FBinding.SetPeer(PeerIP, PeerPort, FBinding.IPVersion);
if FServer.ThreadedEvent then begin
UDPRead;
end else begin
Synchronize(UDPRead);
end;
end;
except
// exceptions should be ignored so that other clients can be served in case of a DOS attack
on E : Exception do
begin
FCurrentException := E.Message;
FCurrentExceptionClass := E.ClassType;
if FServer.ThreadedEvent then begin
UDPException;
end else begin
Synchronize(UDPException);
end;
end;
end;
end;
← →
Costia (2008-02-08 18:37) [5]тоесть компонент для Lazarus
← →
Slym © (2008-02-11 06:28) [6]1. Потоко небезопасный доступ к спискам команд (sendmessage/readmessage)... решение: критические секции (TCriticalSection)
2. Порядок команд нарушается изза - Отправки в несколько соединений... спросишь - ОТКУДА? оттуда - из dTCPServer1Execute не должен выходить пока не порвется соединение, а ты прочитал, отправил и вышел... соединение рвется - если делается повторная отправка то уже на другом соединении... Решение: использовать 1 соединение, либо проверять его единичность в один момент времени.
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
while AContext.Connection.Connected do
begin
if AContext.Connection.IOHandler.Readable then
begin
Lock;
try
readmessage.Add(acontext.Connection.IOHandler.ReadLn);
finally
Unlock;
end;
end;
while sendmessage.count>0 do
begin
Lock;
try
AContext.Connection.IOHandler.WriteLn(sendmessage.Strings[0]);
sendmessage.Delete(0);
finally
Unlock;
end;
end;
end;
end;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.05 c