Mega Code Archive

 
Categories / Delphi / Examples
 

Neoturk forum - tcpclient ile büyük dosyaları göndermek

" 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_