Toon posts:

[Delphi 6] File Transfer In Chunks

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hii,

ik ben bezig met een peer to peer programma en ik will graag weten hoe ik het beste een file in kleine chunks kan zetten en dan op vraag van client betreffende chunk door sturen.

Ongeveer als kazaa waar je een hele film in kleine chunks van meerdere mensen kan downen.

Kan iemand mij hier bij helpen?

Ik gebruik Delphi 6.

Alvast bedankt :)

Raju ;o)

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Bedenk een protocol zodat je je bestanden in delen op kan sturen. Een client zou bijvoorbeeld om een deel van het bestand kunnen vragen in de vorm van beginpos en endpos of je zou bestand altijd in vaste delen op kunnen delen zodat de client alleen het blocknummer hoeft te vragen. Voor de rest vind ik je vraag een beetje te algemeen. Als je nog een specifiek probleem hebt moet je daar maar een specifieke vraag over stellen.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
mijn probleem is hoe ik een bestand in chunks moet delen enn als er nou gevraagd wordt naar een deel 69 dan hoe moet ik die in het bestand zoken?

dus stel ik maak van 500 mb file een chunk van 20kb dus wordt het 256000 chunks.

en een peer stuurt naar deze peer ik wil van die en die file de chunk nr 158 hoe moet ik dan in dat bestand zoeken naar de chunk 158?

ik ben nieuw in delphi dus ik weet nie hoe het kwa code aangepakt moet worden verder heb ik wel een protocol beschreven die verder geimplementeerd wordt in mij programma.


Hoop dat je nu een weet wat ik bedoel :)

Raju ;o

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Algemene tip:

als je nog niet erg bedreven bent in een bepaalde taal, ga dan eerst eens in pseudo-code opschrijven hoe je het zou willen doen. Dus, kom eens met wat pseudo-code.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Verwijderd

Topicstarter
wat is een pseudo-code?

tja wat ik bedoel is:

Wat ik totzover af heb is:
- Client logt in de server
- Server Stuurt Alle Online Users (net als msn)
- Nu stuurt een client naar de server volgende info
(RequestedFilename, ChunkNr)
- Server weet client's sockethandle dus server roept de onderstaande procedure aan.

code:
1
2
3
4
5
6
7
8
9
procedure RequestedChunk(Filename : Stringl; ChunkNr, SckHandle : Integer);
begin

   Open(filename);  
   CalculateChunks;
   Find begin/eind pos van de betreffende deel;
   stuur de betreffende deel naar de SckHandle;

end;


Ongeveer zoiets, is dit mischien duidelijk? :/ :/ :/

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Precies. En welk deel heb je moeite mee? Je kan gewoon binnen een bestand en/of stream springen naar de locatie die je wilt en vanaf daar gegevens lezen.

We adore chaos because we like to restore order - M.C. Escher


  • Spinal
  • Registratie: Februari 2001
  • Laatst online: 15-05 11:48
Seek (F, positie);
waarbij F een bestand is, geopend met OpenFile (F, 'bestandsnaam'); Reset (F);
Positie is uiteraard de positie in het bestand, de eerste byte in het bestand heeft positie 0.

Bedoel je dit misschien?

Full-stack webdeveloper in Groningen


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 26-05 23:14
Verwijderd schreef op 02 april 2004 @ 17:12:
wat is een pseudo-code?

[..]

code:
1
2
3
4
5
6
7
8
procedure RequestedChunk(Filename : Stringl; ChunkNr, SckHandle : Integer);
begin

   Open(filename);  
   CalculateChunks;
   Find begin/eind pos van de betreffende deel;
   stuur de betreffende deel naar de SckHandle;
end;
Dat is dus pseudo-code. :P Zoek voor dat 'vinden' deel eens naar 'seek' in de Delphi documentatie. Berekenen welk stuk je moet hebben moet je zelf doen, maar dat lukt vast wel.

Verwijderd

Topicstarter
bedankt voor de antwoorden :)

ik zal de Seek functie nog effe door kijken en laat je weten of ik nog vragen heb daarover.

b.t.w

Ik heb gehoord dat je met een component van fastnet ook files mee kan inlezen, positie zoeken en versturen en dat dan ook sneller is tja ik weet nix hier van dus kan iemand mij zeggen want het snelste is? want er wordt gewerkt met groteren bestanden van 1+ GB !

Als het mogelijk is graag een voorbeeld app voor mijn probleem :)

Verwijderd

Topicstarter
Als ik nou een chunk heb van 20 kb, moet de client dan begin en eind positie meegeven of een chunk nummer ?

Stel is het een chunk nummer dan moet ik eerst de file in 20kb chunks delen en dan de chunk 560 pakken, maar hoe kan ik de begin en eind van die chunk weten?

ik ga vanuit

Eind :=chunk(begin)+20kb

Hoe moet ik chunk begin bytes weten?

moet ik mischien een while loop hebben dat ie met een groote van 20kb, 560 loops gaat maken? tja hoe gaat het dan kwa code?

Small tips welcome :)

[ Voor 102% gewijzigd door Verwijderd op 03-04-2004 00:44 ]


Verwijderd

Topicstarter
Ok mense!

NIET OP MIJN REPLY TIJD LETTEN AUB 8)7

De situatie is als volgt:
------------------------
Er zijn 2 clients die verbonden zijn met een server. Client1 stuurt een request naar de server met de volgende info: Filename, StartPositie.

Nu Server Zoekt in zijn lijst en vindt dat Client2 die file heeft en vertelt Client2 dat Client1 de volgende gestuurd heeft: Filename, StartPositie.

Nu moet de Client2 de StartPositie vinden in de betreffende file en dan bepaalt de Client2 het eindpositie door zijn maximum Chunk Groote optetellen bij de startpositie.

Daarna Moet de data vanaf StartPositie t/m EindPositie verzonden worden naar de Client2.


Mijn vraag is als volgt:
-----------------------
Ik heb een procedure geschreven die ongeveer doet als de bovenstaande situatie.
Alleen geen id hoe ik verder moet :p

Mischien kunnen jullie mij beter helpen met behulp van de onderstaande procedure :)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  procedure TForm1.DoeIets(FInfo : String; FStartPos : Longint);
  var
        F               : textFile;
        FSize           : Variant;
        FEndPos         : Longint;
  begin
        {- Assumed Incomming Values -}
        FInfo           := 'G:\movie1.avi';
        FStartPos       := 18548;

        {- Set Known Values -}
        FChunkSize      := 10*1024; {In Bytes}
        FEndPos         := FStartPos + FChunkSize;

        {- Open File To Read -}
        AssignFile(F, FInfo);
        Reset(F);

        {- Get File Size -}
        FSize := FileSize(F);

        {- Seek For What?? -}
        Seek(F, FStartPos);

        // Hoe moet ik nu verder??
        // Socket1.SendText(????);
        // Welke componenet kan ik het beste gebruiken
        // om de files te verzenden?
  end;


Alvast bedankt voor jullie antwoorden :)

Raju ;)

[ Voor 37% gewijzigd door Verwijderd op 03-04-2004 03:40 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

NIET OP MIJN REPLY TIJD LETTEN AUB 8)7
Uh, da's normaal onder programmeurs hoor :z

Professionele website nodig?


Verwijderd

Topicstarter
da's moooi :D

Nu hoor ik thuis :P })

[ Voor 10% gewijzigd door Verwijderd op 03-04-2004 03:42 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Verwijderd schreef op 03 april 2004 @ 00:32:
Stel is het een chunk nummer dan moet ik eerst de file in 20kb chunks delen en dan de chunk 560 pakken, maar hoe kan ik de begin en eind van die chunk weten?

ik ga vanuit

Eind :=chunk(begin)+20kb
Begin := 20kb * (ChunckNr - 1) ;
Eind := Begin + 20kb;

En daarom heb je wiskunde nodig bij het programmeren :)
Verwijderd schreef op 03 april 2004 @ 03:26:
code:
1
2
3
4
       // Hoe moet ik nu verder??
        // Socket1.SendText(????);
        // Welke componenet kan ik het beste gebruiken
        // om de files te verzenden?
Alle tcp/ip componenten werken. Er zijn pakketten die blocking werken en pakketten die non-blocking werken. Tis maar welke je lekkerder vind. Het makkelijkst is het om componenten te nemen die je standaard bij Delphi krijgt. Bij D6 en hoger vind je Indy en TTcpClient/TTcpServer. Voor Indy vind je voorbeelden op hun website en voor die andere componeten kan je kijken naar C:\Program Files\Borland\Delphi\Demos\Internet\NetChat. Verder vind je er topics over hier op het forum en op internet.

De meeste componenten hebben een soort van SendString, SendBuffer en SendStream methodes. SendStream is waarschijnlijk het makkelijkst voor jouw, maar dan zal je wel TFileStream moeten gebruiken ipv de AssignFile finctie. Kijk even in de help hoe je TFileStream moet gebruiken.

[ Voor 56% gewijzigd door LordLarry op 03-04-2004 15:10 ]

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
hoe moet ik na de seek verder gaan met de data?

want nu door seek heb ik de beginpositie ingesteld

met welke functie moet ik tot aan de eind poositie in lezen?

tja van friend kreeg ik een tip BlockRead and heeft iemand hier ervaring mee?

  • Spinal
  • Registratie: Februari 2001
  • Laatst online: 15-05 11:48
BlockRead staat goed uitgelegd in de help ;)
Vraagje: waarom beginnen met iets (moeilijks?) als een P2P programma als je dit soort (simpele?) dingen niet kent?

Full-stack webdeveloper in Groningen


Verwijderd

Topicstarter
hij bedankttt :)

ik heb de hulp geschket maar eehhh kan iemand dan effe een voorbeeld blockread statement schrijven die bij mijn code toepast?

Ehh ik heb de rest van de progje wel zelf af kunnen krijgen zoals authenticatie, chat server.. en ik will graag dit er ook bij doen :)

denk niet dat het verkeerd is om effe hulp te gebruiken bij een vrij nieuwe onderdeel (filetransfer in chunks) :)

Hoop iemand mij hiermee kan helpe

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 26-05 22:35

Creepy

Tactical Espionage Splatterer

Eh. de blockread staat, zoals ZanderZ al zegt, prima uitgelegt in de help. Daar heb je echt geen voorbeeld voor nodig.

Of kijk anders eens naar Tstream en varianten (TFileStream).

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • lordsnow
  • Registratie: Maart 2000
  • Laatst online: 12:39

lordsnow

I know nothing

Waarom het wiel opnieuw uitvinden?

Er bestaan al standaard protocollen voor dit gedoe.

Hoe hou jij rekening met:
(1) als een chunk onderweg corrupt raakt?
(2) als iemand een Chunk stturt, zogenaamd van het bestand wat je zoekt, maar het blijkt totaal van iets anders te zijn?
(3) is het mogelijk om chunks te versturen van bestanden die jijzelf nog niet helemaal binnen hebt?

Zoek eens op TigerTreeHash (of TigerHash) i.c.m. filesharing etc.

[ Voor 14% gewijzigd door lordsnow op 04-04-2004 09:21 ]

Pagina: 1