Конференция "Сети" » Как переслать огромный файл по ТСП/ИП от 100 Мб- 4 Гб. [D6, D7, Win2k, WinXP]
 
  • denissoft (17.09.08 19:11) [0]
    Как переслать огромный файл по ТСП/ИП от 100 Мб- 4 Гб.
    Использую обычный ClientSocket и ServerSocket? Какое ограничение по размеру буфера для Win-сокета?
  • Anatoly Podgoretsky © (17.09.08 19:41) [1]
    > denissoft  (17.09.2008 19:11:00)  [0]

    Это не огромный файл, и не отличается от 1 мб файла, кроме времени на пересылку.
  • Сергей М. © (17.09.08 20:25) [2]
    Обычным образом.
    Пересылка двух байт ничем не отличается от пересылки двух терабайт.


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


    Любое в пределах допустимого операционной системой.
  • tesseract © (17.09.08 21:07) [3]

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


    для терабайта я бы асинхронку рекомендовал. Соотвественно, там служебные данные появяться.
  • Сергей М. © (18.09.08 12:20) [4]

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


    Это какие же ?
    И почему "служебные данные" нужны лишь при больших по объему тренслируемых данных ?
  • Anatoly Podgoretsky © (19.09.08 09:21) [5]
    > tesseract  (17.09.2008 21:07:03)  [3]

    До терабайта еще дожить надо и обеспечить должную среду.
  • denissoft (19.09.08 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('ïðèøëà êîìàíäà '+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;

  • Сергей М. © (19.09.08 19:28) [7]

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


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

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

    И не лепи сюда же прочую шнягу.
  • denissoft (19.09.08 19:36) [8]
    если написать sleep(1000); между отправками то вроде файл качается но слишком медленно как быть?
  • Сергей М. © (19.09.08 19:42) [9]
    1. Использовать SendStream
    2. Использовать OnWrite.

    В любом случае - читать документацию и не нести отсебячину.
  • denissoft (19.09.08 19:45) [10]
    в SendStream можно загрузить файл в 2 Гб?
  • Сергей М. © (19.09.08 19:47) [11]

    > idw411.1


    Мало того что дерьмовый софт пересылается, да еще и дерьмовым софтом дерьмовый софт пересылается)
  • Сергей М. © (19.09.08 19:51) [12]

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


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

    А где ты видел дистр-в "Налогоплательщика ЮЛ" размером 2 гб ?)
  • denissoft (19.09.08 19:53) [13]
    Налогоплательщика ЮЛ  для примера
  • Сергей М. © (19.09.08 19:57) [14]
    Бедны-бедные булгактеры)
  • Anatoly Podgoretsky © (19.09.08 21:39) [15]
    > Сергей М.  (19.09.2008 19:57:14)  [14]

    Тебе бухгалтеров жалко, а мне фирму.
  • Сергей М. © (19.09.08 21:59) [16]

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


    Ихнюю ?

    Ну да, и мне тоже
  • denissoft (22.09.08 18:56) [17]
    Ихнюю ?

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

    > да господа далеко пойдете...
  • Сергей М. © (22.09.08 18:59) [18]

    > denissoft   (22.09.08 18:56) [17]


    Вы о чем, любезный ?)
  • Palladin © (23.09.08 13:32) [19]
    Это он вас завуалированно послал )
  • Anatoly Podgoretsky © (23.09.08 14:50) [20]
    Хорошо послал, очено далеко.
  • Eraser © (25.09.08 16:09) [21]
    > [0] denissoft   (17.09.08 19:11)

    как тут и писали - точно так же как и 1 КБ.
    только размер файла лучше передавать в виде int64
  • Rouse_ © (26.09.08 11:07) [22]

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

    Размер файла лучше вообще не передавать, а то всегда найдется умник, который подключится к твоему серверу и отправит туда $FFFFFFFF
  • Городской Шаман (27.09.08 05:19) [23]

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


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

    Ну и проверять чтобы размер пакета не был более, скажем 32Кб + таймаут между пакетами в 30-120 сек(если превышение, то разрыв соединения).
  • Eraser © (30.09.08 16:27) [24]
    > [22] Rouse_ ©   (26.09.08 11:07)

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

    то что умник передаст $FFFFFFFF это уже проблемы умника и системы безопасности. тот, кто не имеет доступа до момента, когда передается размер файла не дойдет )
  • Rouse_ © (30.09.08 17:01) [25]

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

    зачем усложнять? Достаточно кидать все в BASE64 и границы пакетов обрамлять любым символом не входящим в BASE64-последовательность :)
  • Сергей М. © (30.09.08 17:31) [26]
    Эк вас в дебри понесла нелегкая)
    А автор поди схлопотал WSAEWOULDBLOCK и его постиг творческий ступор)
  • brother © (02.10.08 04:31) [27]
  • Городской Шаман (02.10.08 19:23) [28]
    А вообще самый простой способ только для передачи файлов - поднять TFTP из Indy и пересылать через него.
 
Конференция "Сети" » Как переслать огромный файл по ТСП/ИП от 100 Мб- 4 Гб. [D6, D7, Win2k, WinXP]
Есть новые Нет новых   [134432   +19][b:0][p:0.004]