-
Как переслать огромный файл по ТСП/ИП от 100 Мб- 4 Гб.
Использую обычный ClientSocket и ServerSocket? Какое ограничение по размеру буфера для Win-сокета?
-
> denissoft (17.09.2008 19:11:00) [0]
Это не огромный файл, и не отличается от 1 мб файла, кроме времени на пересылку.
-
Обычным образом.
Пересылка двух байт ничем не отличается от пересылки двух терабайт.
> Какое ограничение по размеру буфера для Win-сокета?
Любое в пределах допустимого операционной системой.
-
> Пересылка двух байт ничем не отличается от пересылки двух
> терабайт.
для терабайта я бы асинхронку рекомендовал. Соотвественно, там служебные данные появяться.
-
> там служебные данные появяться.
Это какие же ?
И почему "служебные данные" нужны лишь при больших по объему тренслируемых данных ?
-
> tesseract (17.09.2008 21:07:03) [3]
До терабайта еще дожить надо и обеспечить должную среду.
-
какаета муть я пишу (см ниже) файл доходит но не до конца даже если размер примерно 5 Мб.
на стороне сервера
var
Form1: TForm1;
fs:TFileStream;
fileopen:boolean =false;
msg:boolean;
implementation
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
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;
-
> какаета муть я пишу
Да, ты пишешь какаета муть.
Пиши не какаетамуть, а только то что касается именно передачи файла.
И не лепи сюда же прочую шнягу.
-
если написать sleep(1000); между отправками то вроде файл качается но слишком медленно как быть?
-
1. Использовать SendStream
2. Использовать OnWrite.
В любом случае - читать документацию и не нести отсебячину.
-
в SendStream можно загрузить файл в 2 Гб?
-
> idw411.1
Мало того что дерьмовый софт пересылается, да еще и дерьмовым софтом дерьмовый софт пересылается)
-
> в SendStream можно загрузить файл в 2 Гб?
Нельзя.
Это же не контейнер, чтобы в него "грузить" что-то там)
А где ты видел дистр-в "Налогоплательщика ЮЛ" размером 2 гб ?)
-
Налогоплательщика ЮЛ для примера
-
Бедны-бедные булгактеры)
-
> Сергей М. (19.09.2008 19:57:14) [14]
Тебе бухгалтеров жалко, а мне фирму.
-
> Anatoly Podgoretsky © (19.09.08 21:39) [15]
Ихнюю ?
Ну да, и мне тоже
-
Ихнюю ?
Ну да, и мне тоже...
> да господа далеко пойдете...
-
> denissoft (22.09.08 18:56) [17]
Вы о чем, любезный ?)
-
Это он вас завуалированно послал )
-
Хорошо послал, очено далеко.
-
> [0] denissoft (17.09.08 19:11)
как тут и писали - точно так же как и 1 КБ.
только размер файла лучше передавать в виде int64
-
> только размер файла лучше передавать в виде int64
Размер файла лучше вообще не передавать, а то всегда найдется умник, который подключится к твоему серверу и отправит туда $FFFFFFFF
-
> Rouse_ © (26.09.08 11:07) [22]
>
>
> > только размер файла лучше передавать в виде int64
>
> Размер файла лучше вообще не передавать, а то всегда найдется
> умник, который подключится к твоему серверу и отправит туда
> $FFFFFFFF
точно-точно лучше передавать в каждом уникальный идентификатор открытого файла(выдается на сервере) смещение в файле и размер текущего пакета + хешированный размер пакета(а то всегда найдется умник, который подключится к твоему серверу и отправит туда $FFFFFFFF) + сигнатура + контрольная сумма
Ну и проверять чтобы размер пакета не был более, скажем 32Кб + таймаут между пакетами в 30-120 сек(если превышение, то разрыв соединения).
-
> [22] Rouse_ © (26.09.08 11:07)
я передаю обычно, чтобы можно было расчитать сколько процентов до завершения осталось.
далее уже по частям порциями передача идет.
то что умник передаст $FFFFFFFF это уже проблемы умника и системы безопасности. тот, кто не имеет доступа до момента, когда передается размер файла не дойдет )
-
> точно-точно лучше передавать в каждом уникальный идентификатор
> открытого файла(выдается на сервере) смещение в файле и
> размер текущего пакета + хешированный размер пакета(а то
> всегда найдется умник, который подключится к твоему серверу
> и отправит туда $FFFFFFFF) + сигнатура + контрольная сумма
зачем усложнять? Достаточно кидать все в BASE64 и границы пакетов обрамлять любым символом не входящим в BASE64-последовательность :)
-
Эк вас в дебри понесла нелегкая)
А автор поди схлопотал WSAEWOULDBLOCK и его постиг творческий ступор)
-
-
А вообще самый простой способ только для передачи файлов - поднять TFTP из Indy и пересылать через него.