Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как переслать огромный файл по ТСП/ИП от 100 Мб- 4 Гб. [D6, D7, Win2k, WinXP]


Страницы:   1 2

denissoft ©   (2008-09-17 19:11:00) 

Как переслать огромный файл по ТСП/ИП от 100 Мб- 4 Гб.
Использую обычный ClientSocket и ServerSocket? Какое ограничение по размеру буфера для Win-сокета?


denissoft   (2008-09-19 19:36:00) [21]

если написать sleep(1000); между отправками то вроде файл качается но слишком медленно как быть?


Сергей М.   (2008-09-19 19:28:00) [22]


> какаета муть я пишу


Да, ты пишешь какаета муть.

Пиши не какаетамуть, а только точто касается именно передачи файла.

И не лепи сюда же прочую шнягу.


denissoft   (2008-09-19 19:14:00) [23]

какаета муть я пишу (см ниже) файл доходит но не до конца даже если размер примерно 5 Мб.

на стороне сервера

var
 Form1: TForm1;
 fs:TFileStream;
 fileopen:boolean =false;
 msg:boolean;
implementation

{$R *.dfm}
Function SendCommand(text:string):boolean;
begin
 form1.ServerSocket1.Socket.SendText('>'+text+'#');
 msg:=false;
 repeat
 application.ProcessMessages;
 until msg;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
 label loop;
 var rec,comand:string;
 endfile:boolean;
begin
 rec:=socket.ReceiveText;
 loop:
 if rec'' then begin
   if Fileopen then begin
      endfile:=false;
      if pos('>endfile#',rec)>0 then begin
        delete(rec,pos('>endfile#',rec),length('>endfile#'));
        endfile:=true;
      end;

      if rec'' then
         fs.Write(rec[1],length(rec));
      if endfile then begin
         rec:='>endfile#';
         Fileopen:=false;
      end;

   end;
   if not Fileopen then
    if copy(rec,1,1) ='>' then begin
          comand:=copy(rec,2,pos('#',rec)-2);
          delete(rec,1,pos('#',rec));
          form1.ListBox1.Items.Add('ïðèøëà êîìàíäà '+comand);
          if comand'msg' then socket.SendText('>msg#'); // åñëè ïðèøëî ñîîáùåíèå îòëè÷íîå îò ñëóæåáíîãî òî ïîñûëàåì ñëóæåáíîå ñîîáùåíèå
            if comand = 'file' then begin
                fs:=TFileStream.Create('c:\1.exe', fmCreate);
                Fileopen:=true;
            end;

            if comand = 'endfile' then begin
            closehandle(fs.Handle);
               Fileopen:=false;
            end;

          if rec'' then goto loop;

    end;
 end;
end;


на стороне клиента

var
 Form1: TForm1;
 msg:boolean;
implementation

{$R *.dfm}
Function SendCommand(text:string):boolean;
begin
 form1.ClientSocket1.Socket.SendText('>'+text+'#');
 msg:=false;
 repeat
 application.ProcessMessages;
 until msg;
end;
procedure TForm1.Button1Click(Sender: TObject);
var p:array [1..4096] of byte;
begin
  SendCommand('file');
             with TFileStream.Create('c:\temp\idw411.1.exe', fmOpenRead) do
             begin
            repeat
            Read(p,4096);
            form1.ClientSocket1.Socket.SendBuf(p,4096);
            form1.ListBox1.Items.Add(inttostr(sizeof(p)));

            until Position>=Size;
            free;
            end;
            sleep(1000);
  SendCommand('endfile');
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
 var x:integer;
   rec:string;

begin
 rec:=socket.ReceiveText;
 if pos('>msg#',rec)>0 then msg:=true;
 if rec'>msg#' then socket.SendText('>msg#');

end;


Anatoly Podgoretsky   (2008-09-19 09:21:00) [24]

> tesseract  (17.09.2008 21:07:03)  [3]

До терабайта еще дожить надо и обеспечить должную среду.


Сергей М.   (2008-09-18 12:20:00) [25]


> там служебные данные появяться.


Это какие же ?
И почему "служебные данные" нужны лишь при больших по объему тренслируемых данных ?


tesseract   (2008-09-17 21:07:00) [26]


> Пересылка двух байт ничем не отличается от пересылки двух
> терабайт.


для терабайта я бы асинхронку рекомендовал. Соотвественно, там служебные данные появяться.


Сергей М.   (2008-09-17 20:25:00) [27]

Обычным образом.
Пересылка двух байт ничем не отличается от пересылки двух терабайт.


> Какое ограничение по размеру буфера для Win-сокета?


Любое в пределах допустимого операционной системой.


Anatoly Podgoretsky   (2008-09-17 19:41:00) [28]

> denissoft  (17.09.2008 19:11:00)  [0]

Это не огромный файл, и не отличается от 1 мб файла, кроме времени на пересылку.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо