Examples Delphi

"
Bugün 08:37
Netwotk üzerinden büyük dosyaları nasıl gönderebilirim?
Merhabalar, Ben Indy 10 komponentlerini kullanarak ağ üzerinden dosya gönderip
alan bir Client-Server programı yapıyorum. Yaptığım programda 100MB kadar
olan programlar rahatlıkla gönderilebiliyor, ancak daha büyük dosyalarda
Socket Error 10061 ve 10055 - No Buffer Space Available
hatasını veriyor.
Programda dosya göndermek için
tcpClient.Socket.WriteBufferOpen;
tcpClient.Socket.write(fStream);
tcpClient.Socket.WriteBufferClose;
Yöntemini kullayırum. Problemin bir çözümü için yardımcı olan arkadaşlara
şimdiden çok teşekkür ederim.
yasin_kaya_123
"
**************************************
merhaba,
büyük çaplı dosyayı tek bir seansta "writebuffer" yöntemi ile gönderemeyiz.
bu sorunla bende zamanında karşılaştım.
dosyayı paketler halinde göndermeye çalış, sorun kalmayacaktır.
internet üzerinden 480MB lik dosyayı ben upload ve download etmiştim.
kodunu tam olarak görürsem daha iyi yorum yaparım.
kolay gelsin...
saygılarımla_
neoturk_
************************************
"
procedure TfrmClient.Button3Click(Sender: TObject);
var
fStream: TFileStream;
s,sDosyaAdi, sYol :String;
begin
if not tcpClient.Connected then tcpClient.Connect;
if OpenDialog1.Execute then
begin
sDosyaAdi:=ExtractFileName(OpenDialog1.FileName);
sYol:=Edit2.Text;
tcpClient.Socket.WriteLn('KAY-'+sYol+'\'+sDosyaAdi);
//MSJ(sDosyaAdi);
fStream:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead+fmShareDenyNone);
tcpClient.Socket.WriteLn(inttostr(fStream.Size));
try
s:=tcpClient.Socket.readln;
except
on e:Exception do ShowMessage('Hata:'+e.Message);
end;
//Klasörü oluşturmada hata yoksa dosyayı gönder
if copy(s,1,3)='HAT' then
MSJ(s)
else
begin
MSJ(s);
tcpClient.Socket.WriteBufferOpen;
tcpClient.Socket.write(fStream);
tcpClient.Socket.WriteBufferClose;
FreeAndNil(fStream);
s:=tcpClient.Socket.ReadLn;
if copy(s,1,3)='TAM' then
MSJ(s)
else MSJ(s);
end;
end;
end;
"
************************************
merhaba yasin,
yazdığın kod genel hatlarıyla doğrudur,
ancak, büyük çaptaki dosyaları bu yöntemle gönderemezsin,
nedeni de şudur,
tcpclient bileşeninde kullandığın "write(fstream)" metodu
en fazla 20MB yazmaya izin verir. ( bu winsock cache belleğe
de bağlı olarak değişir, 50MB olur, 100MB olur.. )
göndermek istediğin dosya bu boyutu aştığı için bunu göndermek
istese de program gönderemez. çünkü göndermek istediğin dosyayı
buffere yazmaya çalışır ve hepsini tcp üzerinden tek seansta göndermeye
çalışır, bellek şişer ve socket hatası verir.
bu konuda 2 önerim var,
1. dosyayı parçalara bölüp düzenli olarak peş-peşe göndermen ve daha sonra
bunları birleştirmen ( server tarafında )
2. write(fstream) kullanmadan verileri 512 K lık paketler halinde göndermen.
bu konuda bir çok yazım kod bankasında mevcuttur.
gereken kodları incelersen yardımcı olacaktır.
takıldığın yerde yardımcı olacağım.
kolay gelsin_
saygılarımla_
neoturk_