Форум: "Сети";
Текущий архив: 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