Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Как переслать огромный файл по ТСП/ИП от 100 Мб- 4 Гб.   Найти похожие ветки 

 
denissoft   (2008-09-17 19:11) [0]

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


 
Anatoly Podgoretsky ©   (2008-09-17 19:41) [1]

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

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


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

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


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


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


 
tesseract ©   (2008-09-17 21:07) [3]


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


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


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


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


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


 
Anatoly Podgoretsky ©   (2008-09-19 09:21) [5]

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

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


 
denissoft   (2008-09-19 19:14) [6]

какаета муть я пишу (см ниже) файл доходит но не до конца даже если размер примерно 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("&#239;&#240;&#232;&#248;&#235;&#224; &#234;&#238;&#236;&#224;&#237;&#228;&#224; "+comand);
          if comand<>"msg" then socket.SendText(">msg#"); // &#229;&#241;&#235;&#232; &#239;&#240;&#232;&#248;&#235;&#238; &#241;&#238;&#238;&#225;&#249;&#229;&#237;&#232;&#229; &#238;&#242;&#235;&#232;&#247;&#237;&#238;&#229; &#238;&#242; &#241;&#235;&#243;&#230;&#229;&#225;&#237;&#238;&#227;&#238; &#242;&#238; &#239;&#238;&#241;&#251;&#235;&#224;&#229;&#236; &#241;&#235;&#243;&#230;&#229;&#225;&#237;&#238;&#229; &#241;&#238;&#238;&#225;&#249;&#229;&#237;&#232;&#229;
            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;


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


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


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

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

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


 
denissoft   (2008-09-19 19:36) [8]

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


 
Сергей М. ©   (2008-09-19 19:42) [9]

1. Использовать SendStream
2. Использовать OnWrite.

В любом случае - читать документацию и не нести отсебячину.


 
denissoft   (2008-09-19 19:45) [10]

в SendStream можно загрузить файл в 2 Гб?


 
Сергей М. ©   (2008-09-19 19:47) [11]


> idw411.1


Мало того что дерьмовый софт пересылается, да еще и дерьмовым софтом дерьмовый софт пересылается)


 
Сергей М. ©   (2008-09-19 19:51) [12]


> в SendStream можно загрузить файл в 2 Гб?


Нельзя.
Это же не контейнер, чтобы в него "грузить" что-то там)

А где ты видел дистр-в "Налогоплательщика ЮЛ" размером 2 гб ?)


 
denissoft   (2008-09-19 19:53) [13]

Налогоплательщика ЮЛ  для примера


 
Сергей М. ©   (2008-09-19 19:57) [14]

Бедны-бедные булгактеры)


 
Anatoly Podgoretsky ©   (2008-09-19 21:39) [15]

> Сергей М.  (19.09.2008 19:57:14)  [14]

Тебе бухгалтеров жалко, а мне фирму.


 
Сергей М. ©   (2008-09-19 21:59) [16]


> Anatoly Podgoretsky ©   (19.09.08 21:39) [15]


Ихнюю ?

Ну да, и мне тоже


 
denissoft   (2008-09-22 18:56) [17]

Ихнюю ?

Ну да, и мне тоже...

> да господа далеко пойдете...


 
Сергей М. ©   (2008-09-22 18:59) [18]


> denissoft   (22.09.08 18:56) [17]


Вы о чем, любезный ?)


 
Palladin ©   (2008-09-23 13:32) [19]

Это он вас завуалированно послал )


 
Anatoly Podgoretsky ©   (2008-09-23 14:50) [20]

Хорошо послал, очено далеко.


 
Eraser ©   (2008-09-25 16:09) [21]

> [0] denissoft   (17.09.08 19:11)

как тут и писали - точно так же как и 1 КБ.
только размер файла лучше передавать в виде int64


 
Rouse_ ©   (2008-09-26 11:07) [22]


> только размер файла лучше передавать в виде int64

Размер файла лучше вообще не передавать, а то всегда найдется умник, который подключится к твоему серверу и отправит туда $FFFFFFFF


 
Городской Шаман   (2008-09-27 05:19) [23]


> Rouse_ ©   (26.09.08 11:07) [22]
>
>
> > только размер файла лучше передавать в виде int64
>
> Размер файла лучше вообще не передавать, а то всегда найдется
> умник, который подключится к твоему серверу и отправит туда
> $FFFFFFFF


точно-точно лучше передавать в каждом уникальный идентификатор открытого файла(выдается на сервере) смещение в файле и размер текущего пакета + хешированный размер пакета(а то всегда найдется умник, который подключится к твоему серверу и отправит туда $FFFFFFFF) + сигнатура + контрольная сумма

Ну и проверять чтобы размер пакета не был более, скажем 32Кб + таймаут между пакетами в 30-120 сек(если превышение, то разрыв соединения).


 
Eraser ©   (2008-09-30 16:27) [24]

> [22] Rouse_ ©   (26.09.08 11:07)

я передаю обычно, чтобы можно было расчитать сколько процентов до завершения осталось.
далее уже по частям порциями передача идет.

то что умник передаст $FFFFFFFF это уже проблемы умника и системы безопасности. тот, кто не имеет доступа до момента, когда передается размер файла не дойдет )


 
Rouse_ ©   (2008-09-30 17:01) [25]


> точно-точно лучше передавать в каждом уникальный идентификатор
> открытого файла(выдается на сервере) смещение в файле и
> размер текущего пакета + хешированный размер пакета(а то
> всегда найдется умник, который подключится к твоему серверу
> и отправит туда $FFFFFFFF) + сигнатура + контрольная сумма

зачем усложнять? Достаточно кидать все в BASE64 и границы пакетов обрамлять любым символом не входящим в BASE64-последовательность :)


 
Сергей М. ©   (2008-09-30 17:31) [26]

Эк вас в дебри понесла нелегкая)
А автор поди схлопотал WSAEWOULDBLOCK и его постиг творческий ступор)


 
brother ©   (2008-10-02 04:31) [27]

вот это может подойдет? http://www.delphisources.ru/pages/sources/internet/2006_year/send_udp.html


 
Городской Шаман   (2008-10-02 19:23) [28]

А вообще самый простой способ только для передачи файлов - поднять TFTP из Indy и пересылать через него.



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.082 c
15-1267433491
Prizrak
2010-03-01 11:51
2010.08.27
Delphi утилита для извлечения функций из любой dll


15-1272832202
Юрий
2010-05-03 00:30
2010.08.27
С днем рождения ! 3 мая 2010 понедельник


2-1270132693
vlad2
2010-04-01 18:38
2010.08.27
Искажение иконок в трее


15-1265497950
Германн
2010-02-07 02:12
2010.08.27
Опции компилятора DEBUG, RELEASE в CodeGear2007


15-1272391343
GanibalLector
2010-04-27 22:02
2010.08.27
Обрыв сетевого подключения. Как?