Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.09.2012, 03:56
Dauka Dauka вне форума
Прохожий
 
Регистрация: 29.08.2012
Сообщения: 3
Репутация: 10
По умолчанию Clientsocket to serversocket

Подскажите как передать и имя передаваемого файла ?
вместе FileStream:=TFileStream.Create(Edit1.Text, fmOpenRead);

FileStream:=TFileStream.Create(DirectoryListBox1.D irectory+'\'+fname, fmOpenRead);



использовал этот код ( нашел здесь на форуме ответ от NUMLOCK)
Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;
 
type
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    ClientSocket1: TClientSocket;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
    FPipeRead: THandle;
    FPipeWrite: THandle;
    FDataLen: DWORD;
    FDataRead: DWORD;
    FFileStream: TFileStream;
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  CreatePipe(FPipeRead, FPipeWrite, nil, $8000);
  FDataLen:=0;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  CloseHandle(FPipeWrite);
  CloseHandle(FPipeRead);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientSocket1.Open;
end;
 
procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('Client Connect');
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  FileStream: TFileStream;
  len: DWORD;
begin
  FileStream:=TFileStream.Create(Edit1.Text, fmOpenRead);
  try
    len:=FileStream.Size;
    ClientSocket1.Socket.SendBuf(len, SizeOf(len));
    ClientSocket1.Socket.SendStream(FileStream);
  except
    FileStream.Free;
  end;
end;
 
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
<font color="Blue">var
  Len: Integer;
  Buffer: PChar;
  dummy: Cardinal;
begin
  Len:=Socket.ReceiveLength;
  Buffer:=GetMemory(Len);
  try
    Len:=Socket.ReceiveBuf(Buffer^, Len);
    WriteFile(FPipeWrite, Buffer^, Len, dummy, nil);
  finally
    FreeMemory(Buffer);
  end;
  while True do
  begin
    Len:=GetFileSize(FPipeRead, nil);
    if Len=0 then Break;
    if FDataLen=0 then
    begin
      if Len<SizeOf(DWORD) then Break;
      ReadFile(FPipeRead, FDataLen, SizeOf(DWORD), dummy, nil);
      FDataRead:=0;
      FFileStream:=TFileStream.Create(Edit2.Text, fmCreate);
    end else
    begin
      Buffer:=GetMemory(Len);
      try
        ReadFile(FPipeRead, Buffer^, Len, dummy, nil);
        FFileStream.Write(Buffer^, Len);
        Inc(FDataRead, Len);
        if FDataRead=FDataLen then
        begin
          FFileStream.Free;
          FDataLen:=0;
          Memo1.Lines.Add('Ok');
        end;
      finally
        FreeMemory(Buffer);
      end;
    end;
  end;
end;</font>
 
end.
Ответить с цитированием
  #2  
Старый 02.09.2012, 08:27
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

вместо передачи 4-х байтового размера файла нужно передавать структуру фиксированой длины с размером и именем файла.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 02.09.2012, 11:33
Dauka Dauka вне форума
Прохожий
 
Регистрация: 29.08.2012
Сообщения: 3
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
вместо передачи 4-х байтового размера файла нужно передавать структуру фиксированой длины с размером и именем файла.
А можно примерчик ? )
Ответить с цитированием
  #4  
Старый 02.09.2012, 11:49
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
type
  TFileInfo = record
    FileName: String[$ff];
    FileSize: DWORD;
  end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 02.09.2012, 18:26
Dauka Dauka вне форума
Прохожий
 
Регистрация: 29.08.2012
Сообщения: 3
Репутация: 10
По умолчанию

а можно дальше ?)
Ответить с цитированием
  #6  
Старый 03.09.2012, 04:01
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Dauka, Свободен!
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:02.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter