Форум: "Сети";
Текущий архив: 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("ïðèøëà êîìàíäà "+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;
← →
Сергей М. © (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