procedure HandleCommands(Thread: TThread; Socket: TClientSocket; ParseProcedure: TParseProcedure; Stream: TMemoryStream);
var
Frame: TCommandFrame;
FrameStream: TMemoryStream;
Position: dword;
begin
Position := 0;
FrameStream := TMemoryStream.Create;
try
while Position < Stream.Size do
begin
Stream.Position := Position;
Stream.ReadBuffer(Frame, SizeOf(TCommandFrame));
Inc(Position, SizeOf(TCommandFrame));
FrameStream.Clear;
FrameStream.Position := 0;
FrameStream.CopyFrom(Stream, Frame.Len);
Inc(Position, Frame.Len);
FrameStream.Position := 0;
ParseProcedure(Thread, Socket, Frame, FrameStream);
end;
finally
FrameStream.Free;
end;
end;procedure HandleConnection(Thread: TThread; ParseProcedure: TParseProcedure; Socket: TClientSocket);
var
Frame: TStreamFrame;
Buffer: array[0..4095] of Char;
Stream: TMemoryStream;
BytesReceived, StreamReceived: dword;
OutputStream: TMemoryStream;
DecompressionStream: TDecompressionStream;
Nonblocking: cardinal;
begin
Application := TApplication.Create;
while Socket.Connected do
begin
Sleep(1);
Application.ProcessMessages;
ZeroMemory(@Frame, SizeOf(TStreamFrame));
StreamReceived := 0;
BytesReceived := Socket.ReceiveBuffer(Frame, SizeOf(TStreamFrame));
if BytesReceived < SizeOf(TStreamFrame) then Continue;
if Frame.Id <> FRAME_ID then Exit;
Stream := TMemoryStream.Create;
Stream.SetSize(Frame.Len);
if Stream.Size < Frame.Len then Exit;
try
while ((StreamReceived < Frame.Len) and (Socket.Connected)) do
begin
Application.ProcessMessages;
BytesReceived := Socket.ReceiveBuffer(Buffer, SizeOf(Buffer));
if BytesReceived > 0 then
begin
Inc(StreamReceived, BytesReceived);
Stream.WriteBuffer(Buffer, BytesReceived);
end;
end;
Stream.Position := 0;
OutputStream := TMemoryStream.Create;
try
DecompressionStream := TDecompressionStream.Create(Stream);
OutputStream.CopyFrom(DecompressionStream, 0);
DecompressionStream.Free;
OutputStream.Position := 0;
Nonblocking := 0;
ioctlsocket(Socket.Socket, FIONBIO, Nonblocking);
HandleCommands(Thread, Socket, ParseProcedure, OutputStream);
Nonblocking := 1;
ioctlsocket(Socket.Socket, FIONBIO, Nonblocking);
finally
OutputStream.Free;
end;
finally
Stream.Free;
end;
end;
Application.Free;
end;
请问这段代码有什么用
var
Frame: TCommandFrame;
FrameStream: TMemoryStream;
Position: dword;
begin
Position := 0;
FrameStream := TMemoryStream.Create;
try
while Position < Stream.Size do
begin
Stream.Position := Position;
Stream.ReadBuffer(Frame, SizeOf(TCommandFrame));
Inc(Position, SizeOf(TCommandFrame));
FrameStream.Clear;
FrameStream.Position := 0;
FrameStream.CopyFrom(Stream, Frame.Len);
Inc(Position, Frame.Len);
FrameStream.Position := 0;
ParseProcedure(Thread, Socket, Frame, FrameStream);
end;
finally
FrameStream.Free;
end;
end;procedure HandleConnection(Thread: TThread; ParseProcedure: TParseProcedure; Socket: TClientSocket);
var
Frame: TStreamFrame;
Buffer: array[0..4095] of Char;
Stream: TMemoryStream;
BytesReceived, StreamReceived: dword;
OutputStream: TMemoryStream;
DecompressionStream: TDecompressionStream;
Nonblocking: cardinal;
begin
Application := TApplication.Create;
while Socket.Connected do
begin
Sleep(1);
Application.ProcessMessages;
ZeroMemory(@Frame, SizeOf(TStreamFrame));
StreamReceived := 0;
BytesReceived := Socket.ReceiveBuffer(Frame, SizeOf(TStreamFrame));
if BytesReceived < SizeOf(TStreamFrame) then Continue;
if Frame.Id <> FRAME_ID then Exit;
Stream := TMemoryStream.Create;
Stream.SetSize(Frame.Len);
if Stream.Size < Frame.Len then Exit;
try
while ((StreamReceived < Frame.Len) and (Socket.Connected)) do
begin
Application.ProcessMessages;
BytesReceived := Socket.ReceiveBuffer(Buffer, SizeOf(Buffer));
if BytesReceived > 0 then
begin
Inc(StreamReceived, BytesReceived);
Stream.WriteBuffer(Buffer, BytesReceived);
end;
end;
Stream.Position := 0;
OutputStream := TMemoryStream.Create;
try
DecompressionStream := TDecompressionStream.Create(Stream);
OutputStream.CopyFrom(DecompressionStream, 0);
DecompressionStream.Free;
OutputStream.Position := 0;
Nonblocking := 0;
ioctlsocket(Socket.Socket, FIONBIO, Nonblocking);
HandleCommands(Thread, Socket, ParseProcedure, OutputStream);
Nonblocking := 1;
ioctlsocket(Socket.Socket, FIONBIO, Nonblocking);
finally
OutputStream.Free;
end;
finally
Stream.Free;
end;
end;
Application.Free;
end;
请问这段代码有什么用
HandleConnection:连接,如:FTP
HandleCommands: 命令,如:FTP HOOK COMMAND