Форум: "Сети";
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];
ВнизСобытие ClientSocketRead Найти похожие ветки
← →
Digitman (2002-01-23 09:56) [3]Примерно так это должно выглядеть :
1.Сервер ( посылает )
var
DataFile: TMemoryStream;
Command: byte;
FuncParam: string;
FuncParamSize: Integer;
DataFile: TMemoryStream;
p: Pointer;
begin
FuncParam:= "dev:\fullpath\datafile.ext";
FuncParamSize:= Length(FuncParam);
Command:= 1;
DataFile := TMemoryStream.Create;
with ServerSocket1.Socket, DataFile do
try
DataFile.LoadFromFile(FuncParam);
Size := DataFile.Size;
Connections[0].SendBuf(Command, SizeOf(Command));
Connections[0].SendBuf(FuncParamSize, SizeOf(FuncParamSize));
if FuncParamSize > 0 then
Connections[0].SendBuf(@FuncParam[1], SizeOf(FuncParamSize));
Connections[0].SendBuf(Size, SizeOf(Size));
Connections[0].SendBuf(Memory^, Size);
finally
DataFile.Free;
end;
end;
2.Клиент ( принимает )
type
ESocketReadError = class(Exception)
end;
function ReceiveDataBlock(Socket: TCustomWinSocket; Buf: Pointer; ExpextedBlockSize: Integer): Boolean;
var
BytesRead: Integer;
begin
Result:= False;
with Socket do
while ExpextedBlockSize > 0 do begin
BytesRead := ReceiveBuf(Buf^, ExpextedBlockSize);
if BytesRead > 0 then begin
Dec(ExpextedBlockSize, BytesRead);
Inc(Integer(Buf), BytesRead);
end else
Exit;
end;
Result := True;
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
FuncParam: string;
FuncParamSize: Integer;
DataFile: TMemoryStream;
DataFileSize: Integer;
begin
try
if not ReceiveDataBlock(Socket, @Command, SizeOf(Command)) then
raise ESocketReadError.Create("Ошибка чтения команды");
case Command of
01:
begin
if not ReceiveDataBlock(Socket, @FuncParamSize, SizeOf(FuncParamSize)) then
raise ESocketReadError.Create("Ошибка чтения размера параметра");
SetLength(FuncParam, FuncParamSize);
if FuncParamSize > 0 then
if not ReceiveDataBlock(Socket, @FuncParam[1], FuncParamSize) then
raise ESocketReadError.Create("Ошибка чтения параметра команды");
if not ReceiveDataBlock(Socket, @DataFileSize, SizeOf(DataFileSize)) then
raise ESocketReadError.Create("Ошибка чтения размера файлового потока");
DataFile:= TMemoryStream.Create;
try
DataFile.Size := DataFileSize;
if not ReceiveDataBlock(Socket, DataFile.Memory, DataFileSize) then
raise ESocketReadError.Create("Ошибка чтения файлового потока");
DataFile.SaveToFile(FuncParam);
Form2.Memo1.Lines.LoadFromStream(DataFile);
finally
DataFile.Free;
end;
end;
else
raise ESocketReadError.Create("Неизвестная команда");
end;
except
Socket.Disconnect;
raise;
end;
end;
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c