Главная страница
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.47 MB
Время: 0.066 c
1-1095949017
zokzok
2004-09-23 18:16
2004.10.10
StringGrid


1-1096159405
Leaner
2004-09-26 04:43
2004.10.10
Ошибка: C0000008 в строке CloseHandle(FHand);


6-1089920985
Artemon1
2004-07-15 23:49
2004.10.10
Скачивание jpg


3-1095151602
}|{yk
2004-09-14 12:46
2004.10.10
Что это 8-(???


1-1096025332
SergeyM
2004-09-24 15:28
2004.10.10
Текст в формате HTML