![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как переслать огромный файл по ТСП/ИП от 100 Мб- 4 Гб. [D6, D7, Win2k, WinXP]
denissoft © (2008-09-17 19:11:00)Как переслать огромный файл по ТСП/ИП от 100 Мб- 4 Гб.
Использую обычный ClientSocket и ServerSocket? Какое ограничение по размеру буфера для Win-сокета?
denissoft (2008-09-19 19:36:00) [21]если написать sleep(1000); между отправками то вроде файл качается но слишком медленно как быть?
Сергей М. (2008-09-19 19:28:00) [22]
> какаета муть я пишу
Да, ты пишешь какаета муть.
Пиши не какаетамуть, а только точто касается именно передачи файла.
И не лепи сюда же прочую шнягу.
denissoft (2008-09-19 19:14:00) [23]какаета муть я пишу (см ниже) файл доходит но не до конца даже если размер примерно 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;
Anatoly Podgoretsky (2008-09-19 09:21:00) [24]> tesseract (17.09.2008 21:07:03) [3]
До терабайта еще дожить надо и обеспечить должную среду.
Сергей М. (2008-09-18 12:20:00) [25]
> там служебные данные появяться.
Это какие же ?
И почему "служебные данные" нужны лишь при больших по объему тренслируемых данных ?
tesseract (2008-09-17 21:07:00) [26]
> Пересылка двух байт ничем не отличается от пересылки двух
> терабайт.
для терабайта я бы асинхронку рекомендовал. Соотвественно, там служебные данные появяться.
Сергей М. (2008-09-17 20:25:00) [27]Обычным образом.
Пересылка двух байт ничем не отличается от пересылки двух терабайт.
> Какое ограничение по размеру буфера для Win-сокета?
Любое в пределах допустимого операционной системой.
Anatoly Podgoretsky (2008-09-17 19:41:00) [28]> denissoft (17.09.2008 19:11:00) [0]
Это не огромный файл, и не отличается от 1 мб файла, кроме времени на пересылку.