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

Вниз

Socket   Найти похожие ветки 

 
Hereticsoul ©   (2004-08-04 11:18) [0]

Уважаемые Мастера и Мастерицы
вообщем есть небольшая проблема пишу итра-корпоративный чат возникла необходимость получить возможность отсылать большие данные и учитывать склеенность пакетов...
соответственно пишу модуль по статье(автор:Subfire "mailto:subfire@mail.ru") для этого но...
у меня что не так
пошло,помогите советом профи пожалуйста...смотрите:
//////////////////////////////////////////////////////////////////////////////
unit LongDataTransfer;

interface
uses ScktComp;
type
 TMySProc = procedure(const S: AnsiString);
function SendLongText(Socket: TCustomWinSocket; S: string): boolean;
function ReceiveLongText(Socket: TCustomWinSocket; MySProc: TMySProc;
 SafeCalledStr: string = ""): boolean;

var
 InputBuf: string;
 InputDataSize: LongWord;
 InputReceivedSize: LongWord;

 ................................

procedure FlushBuffers;
begin
 InputBuf := "";
 InputDataSize := 0;
 InputReceivedSize := 0;
end;

function ReceiveLongText(Socket: TCustomWinSocket; MySProc: TMySProc;
 SafeCalledStr: string = ""): boolean;
var
 S: string;
 RDSize: LongWord;
 F: string[4];
begin
 Result := True;
 try
   if SafeCalledStr = "" then
   begin
     RDSize := Socket.ReceiveLength;
     S := Socket.ReceiveText;
   end
   else
   begin

     S := SafeCalledStr;
     RDSize := length(S);
   end;
   if (Length(InputBuf) < 4) and (Length(InputBuf) > 0) then
   begin //Корректировка, в том случае
     S := InputBuf + S; //если фрагментирован сам заголовок
     FlushBuffers; //блока данных
   end;
   if InputBuf = "" then
   begin //Самый первый пакет;
     F := Copy(S, 0, 4);
     asm
                       mov EAX,dword ptr F[1];
                       mov InputDataSize,EAX;
     end;

     if InputDataSize = RDSize - 4 then
     begin //Один блок в пакете

       InputBuf := Copy(S, 5, RDSize - 4); //ни слепки, ни фрагментации нет.
       MySProc(InputBuf);
       FlushBuffers;
       Exit;
     end;
     if InputDataSize < RDSize - 4 then
     begin //Пакет слеплен.
       InputBuf := Copy(S, 5, InputDataSize);
       MySProc(InputBuf);
       Delete(S, 1, InputDataSize + 4);
       FlushBuffers;
       ReceiveLongText(Socket, MySProc, S);
       Exit;
     end;
     if InputDataSize > RDSize - 4 then
     begin //это ПЕРВЫЙ фрагмент
       InputBuf := Copy(S, 5, RDSize - 4); //большого пакета
       InputReceivedSize := RDSize - 4;
     end;
   end
   else
   begin //Буфер приема не пуст
     //InputBuf:=
     if RDSize + InputReceivedSize = InputDataSize then
     begin //Получили последний
       InputBuf := InputBuf + Copy(S, 0, RDSize); //фрагмент целиком
       MySProc(InputBuf); //в пакете, данных
       FlushBuffers; // в пакете больше нет
       Exit;
     end;
     if RDSize + InputReceivedSize < InputDataSize then // Получили
     begin //очередной
       InputBuf := InputBuf + Copy(S, 0, RDSize); //фрагмент
       InputReceivedSize := InputReceivedSize + RDSize;
       Exit;
     end;
     if RDSize + InputReceivedSize > InputDataSize then //Поледний фрагмент
     begin // но в пакете есть еще данные - слеплен.
       InputBuf := InputBuf + Copy(S, 0, InputDataSize - InputReceivedSize);
       MySProc(InputBuf);
       Delete(S, 1, InputDataSize - InputReceivedSize);
       FlushBuffers;
       ReceiveLongText(Socket, MySProc, S);
     end;
   end;
 except Result := False;
 end;
end;

end.
///////////////////////////////////это была его функция....далее я пишу:
1  procedure DataProcessing(S: string);
2  begin
3  showmessage(s);
4  end;
5
6  procedure TForm1.Clientsocket1Read(Sender: TObject;
7  Socket: TCustomWinSocket);
8
9  begin
10 ReceiveLongText(Clientsocket1.Socket,DataProcessing);
11 end;

и в строчке 10 компилятор сообщает :
"[Error] Mainunit.pas(256): Incompatible types: "Parameter lists
differ"
"

Заранее благодарю Евгений


 
Digitman ©   (2004-08-04 11:58) [1]

ReceiveLongText(Clientsocket1.Socket,@DataProcessing);


 
Hereticsoul ©   (2004-08-04 12:06) [2]

2Digitman
Блин спасибо огромное...как с этим проектом закончу...клянусь начну книжки по делфям читать :)...



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

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

Наверх




Память: 0.48 MB
Время: 0.026 c
4-1094602456
jack128
2004-09-08 04:14
2004.10.10
Запуск программы из под IDE. Проблемы..


1-1095960132
lipskiy
2004-09-23 21:22
2004.10.10
Как назначить PopupMenu на один из пунктов MainMenu (Срочно!!!)


14-1095508040
Программер_
2004-09-18 15:47
2004.10.10
Вот привожу код и пусть кто мне сможет сказать что нем


6-1091384596
Роман.В
2004-08-01 22:23
2004.10.10
Аутентификация в TNMSMTP


14-1095750324
X9
2004-09-21 11:05
2004.10.10
Подстрочный символ (Цифра) в TLabel