Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Как переслать огромный файл по ТСП/ИП от 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.091 c
2-1273599931
DROWSY
2010-05-11 21:45
2010.08.27
DBGrid, DBGridEh.


2-1267989705
Delphist
2010-03-07 22:21
2010.08.27
подключение DBGrid к SQL Server в Delphi 2010


15-1266047756
oldman
2010-02-13 10:55
2010.08.27
Ну вот и началась Олимпиада!


2-1274166166
pro_xaoc
2010-05-18 11:02
2010.08.27
Загружать изображение при наведении и кликании мышью


2-1273815100
tippa
2010-05-14 09:31
2010.08.27
алгоритм удаления дубликатов из списка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский