Показать сообщение отдельно
  #6  
Старый 19.10.2010, 21:36
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Итак.
Сервер:
Код:
procedure TForm3.TcpServer1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
var
  stream: TMemoryStream;
  msg: string;
  sz: integer;
begin
  if ClientSocket.Connect then
  begin
    msg := ClientSocket.Receiveln;
    stream := TMemoryStream.Create;
    sz := StrToInt(msg);
    stream.SetSize(sz);
    ClientSocket.Sendln('ok');

    ClientSocket.ReceiveBuf(stream.Memory^, sz);
    stream.SaveToFile('123.exe');
    stream.Free;
    ClientSocket.Disconnect;
  end;
end;

Клиент:
Код:
procedure TForm4.Button1Click(Sender: TObject);
var
  stream: TMemoryStream;
  msg: string;
begin
  if TcpClient1.Connect then
  begin
    stream := TMemoryStream.Create;
    stream.LoadFromFile('C:\123.exe');
    TcpClient1.Sendln(IntToStr(stream.Size));
    if TcpClient1.Receiveln = 'ok' then
      TcpClient1.SendBuf(stream.Memory^, stream.Size);
    TcpClient1.Disconnect;
  end
  else showmessage('Error connecting');
end;

У меня такой вариант работает.
Дело в том, что recieveBuf(stream,X) по идеи некорректная запись: Stream - это по сути указатель. В итоге получается, что отправляется и принимается не то, что нужно, а X байт, начиная с адреса Stream в памяти.
Ответить с цитированием