Главная страница
    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.036 c
1-1095861749
DelphiLexx
2004-09-22 18:02
2004.10.10
Общедоступные паременные


14-1096002016
080D:07BBh
2004-09-24 09:00
2004.10.10
Caliber RM


6-1091184051
Гость
2004-07-30 14:40
2004.10.10
WEBBROWSEr1


1-1096264936
Rostislav Rotaru
2004-09-27 10:02
2004.10.10
Помогите перевести на Delphi


1-1096012898
AndrewH
2004-09-24 12:01
2004.10.10
Компонент для Crystal Reports 10





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский