Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.04 c
1-1096288343
Madness
2004-09-27 16:32
2004.10.10
как нажать кнопку?


3-1094805144
sashuly
2004-09-10 12:32
2004.10.10
Сортировка в TTAble


1-1096276131
Sphinx
2004-09-27 13:08
2004.10.10
BITMAP in TStream


1-1096266185
samumka
2004-09-27 10:23
2004.10.10
События в TDBGrid ?


1-1095753144
roma
2004-09-21 11:52
2004.10.10
kataloq





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский