Avatar billede Slettet bruger
27. maj 2006 - 21:29 Der er 21 kommentarer

Søger lidt hjælp ang TCP fil-overførsel

Davs eksperter..

Jeg er med en ven igang med at udvikle et LOKALT p2p program, det skal kun fungere inde for et større lokalt netværk.

Sådan som vi bedst kunne håndtere folk der logger på var at lave en tråd for hver bruger, den tråd holder styr på den connection og kommandoer. Vi er nu kommet til fil overførsel, og ved ikke hvordan vi skal håndtere det. Jeg har en funktion der indsætter en preheader hver gang man sender en række karakterer, så man på den måde kan modtage det på den anden side, og smide det ind i en fil fx.

?sendfile#5k6j54654t8j4690jg96u5409jgj85j85jg865gj9865jy98
87498tu895t5498gh5498gh5948gh6859gh498yth5689yhg985hg98[END]

You get the point. Men på den måde kan man jo kun hente en fil ad gangen... skal jeg lave en ny connection til hver overførsel eller hvordan? syntes i forvejen vi kører mange tråde!
Avatar billede sovsekoder Nybegynder
27. maj 2006 - 21:37 #1
du kan putte noget info i din header:
fil_id = 1,
block = 10,
max_blocks = 20,
andet...
så du siger til klienten: "nu får du blok 10 ud af 20 for fil nr. 1". Så skal klienten indeholde logik til at skelne mellem de filer den modtager.
Avatar billede arne_v Ekspert
27. maj 2006 - 21:40 #2
det nemmeste er formentligt med en socket til kommandoer og så en socket til data
for hver fil overførsel

det bruger FTP også !

men jeg lavede et eksempel med noget socket multiplexing her for nogle
uger siden
Avatar billede Slettet bruger
27. maj 2006 - 21:45 #3
Arne# Du mener altså med seperart port osv?

Hvor mange tråede er du klogt at køre med i sin app?.. her tænker jeg, på det kollegie jeg bor på hvor progammet skal bruges, har vi ca 200 potentielle brugere. Det er jo så = 200 tråde!?
Avatar billede arne_v Ekspert
27. maj 2006 - 21:50 #4
200 er lift heftigt. 25-50 er bedre.

Men er det realistisk med mere end 50 fil overførsler samtidigt ?

Hvis ja så er der visse muligheder for at have en tråd servicere mere end en socket.
Avatar billede Slettet bruger
27. maj 2006 - 21:50 #5
det er ikke fil overførsler, men bruger tråde, tråd for hver bruger
Avatar billede Slettet bruger
27. maj 2006 - 21:53 #6
Når en bruger logger på, kører han den funktion der modtager alt data, jeg ville meget gerne have det til at køre med kun et tråd til at håndtere alle brugere, det data de sender mellem hinanden er jo helt ent, men ved ikke hvordan jeg skal håndtere at det kan kende forskel på brugerne

Jeg er villig til at sende dig komplet source hvis du vil se nærmere på det, der ligger ikke så forfærdelig meget kode bag :)
Avatar billede sovsekoder Nybegynder
27. maj 2006 - 23:05 #7
serverens tråd 1) håndterer indkommende forbindelser. Når denne tråd får en forbindelse fra en klient, gemmes forbindelsens endpoint (klienten) i en liste.

serverens tråd 2) lytter på klienternes "requests" vha. klient listen (itererer over klient listen). Når der kommer et request, bliver der spawned en tråd til at håndtere denne request (klient informationerne videregives til denne nye tråd) - formålet med at spawne en tråd her er at undgå blokkering ved fejl i serverens tråd 2) (request tråden).

Du kunne implementere et loft for tråde der håndterer requests - således at når loftet er nået, så må "ventende" tråde bare vente til der er plads til dem... men disse tråde vil ikke blokkere serverens tråd 2 (lytte tråden) da de er spawned her fra.

giver det mening?
Avatar billede Slettet bruger
27. maj 2006 - 23:12 #8
Hmm.. det skal siges at det er Client-To-Client forbindelser, de opererer både som server og client

Jeg har en tråd der acceptere forbindelser, denne opretter så en tråd for den forbindelse den får ind, og gemmer EP i et arraylist

Sad lige og tænkte på, skulle jeg så køre et loop der reciever på hvert endpoint i det arraylist?.. eller hvordan mener du?
Avatar billede sovsekoder Nybegynder
28. maj 2006 - 09:26 #9
ja, det ville jeg regne med. Loopet behandler hvert EndPoint, og spørger om der er data tilgængelig. Hvis der er data tilgængelig, spawnes en ny tråd der håndterer dette - og loopet fortsætter med næste EP.
Avatar billede Slettet bruger
28. maj 2006 - 13:22 #10
Men recv funktionen stopper jo tråden, den går kun videre når den modtager noget. Hvis der nu er en der sender noget til en socket hvor der lige nu ikke bliver lyttet på, vil man så kunne hive det ud når den kommer til at lytte på den socket, eller hvordan?

Kort sagt, vil det virke?
Avatar billede sovsekoder Nybegynder
28. maj 2006 - 13:32 #11
her kan du måske finde inspiration:
http://www.codeproject.com/csharp/XYNetSocket.asp

her er en tråd - Accept clients der modtager forbindelse via. Socket.Poll(...); når en klient er connected bliver den tilføjet en liste. slut for den tråd.

næste tråd "DetectInput" finder ud af om der er en der prøver at snakke vha. socket.Available, hvis der er mere end 0 bytes klar har vi en snakkende-klient. Vi spawner derfor en ny tråd til at håndtere dette => da receive rigtigt blokkerer tråden som du siger.

tråden ProcessInput håndtere så det pågældende request, men altså i en seperat tråd.

Med dette setup får du skilt følgende dele ad (så de ikke blokerer hinanden) ->
1) acceptering af klient forbindelse
2) indentifikation af "ny kommunikation"
3) den aktuelle håndtering af kommunikationen (her foretages send/receive)
Avatar billede sovsekoder Nybegynder
28. maj 2006 - 13:34 #12
p.s. jeg har ikke prøvet hans komponent (den fra codeproject) så jeg ved ikke om den virker, men princippet er der...
Avatar billede md_craig Nybegynder
28. maj 2006 - 13:41 #13
Hehe... står selv og arbejde med dataoverførelse (Sovsekoder knows)... dog til et lidt andet formål samt en anden problem stilling, ikke desto mindre er nogle af tingene oppe og vende, så du kan evt. kigge forbi:

http://www.eksperten.dk/spm/712020

From time to time, for at se hvad jeg fx finder ud af, ligeledes vil jeg da lige lytte med her som gensidig inspiration...

Jeg står dog nok over for et "stører" redesign, da jeg indtil nu har kørt PooledThreads via. Delegates, hvilket måske skal laves om til at jeg selv stører alt omkring denne Pool.

Desuden er ideer oppe at vende omkring at en tråd godt kan tage sig af at sende filer til X antal klienter. osv osv...

Endelig, Sovsekoder nævner i starten det at putte info i en filheader, det er hvad jeg selv gør, og kan lige outline din info jeg smider i henholdsvis Header samt Frames

Header:
byte[] SyncBlok: 12 byte (%01010101)
string HeaderIndikatior: 8 byte ("NTCPHEAD", UTF-8)
long FrameAntal: 8 byte (Antallet af "blokke" filen er delt op i)
long PakkeStørelse: 8 byte (Den totale mængde af bytes der skal overføres ex. headeren)
long FilStørelse: 8 byte (Filens størelse i bytes)
uint PakkeID: 4 byte (En pakkes ID, benytter selv CRC til dette, men ikke ud fra filens data)
uint FilID: 4 byte (Filens ID, hvis filen har sådan et)
ushort FrameStørelse: 2 byte (størelsen på en Frame, max 65KB)
byte[] Padding: 8 byte (For at en header passer med 64 byte)

Frame:
byte[] SyncBlok: 12 byte (%01010101)
long FrameNummer: 8 byte (Nummeret på framen, 0,1,2,3 osv op til det totale antal af frames)
uint PakkeID: 4 byte (En referance til hvilken pakke denne fil tilhører)
ushort DataStørelse: 2 byte (Mængden af faktiske bytes i framen, da framen er af statisk størelse i mit ekempel, så skal man kunne frasotere overskydende data i sidste frame)
byte[] Datablokken: x byte (Den data som der skal overføres)
Avatar billede Slettet bruger
28. maj 2006 - 14:03 #14
wow det er svært at sætte sig ind i, sovsekoders link, kan dog godt se logikken i det..

Jeg vil tro det umidlbart er "nemt" at få til at virke i min kode, da den er ret overskuligt opbygget, er der nogen der evt har lyst til at give en hånd med?..
Avatar billede Slettet bruger
28. maj 2006 - 20:48 #15
Har du fået det til at vike nogenlunde nu! det var enda super nemt at implamentere.. nu skal jeg bare have kigget nærmere på det, og få det til at virke ordenligt
Avatar billede sovsekoder Nybegynder
28. maj 2006 - 21:52 #16
lol, det lyder til at du har fået vind i sejlene
Avatar billede Slettet bruger
28. maj 2006 - 21:54 #17
njaa, satte mig bare lidt ind i det, og testede mig frem.. Er det dig der har lavet Threadpool classen? for den virker da ret smart.
Avatar billede sovsekoder Nybegynder
28. maj 2006 - 21:56 #18
nej... fandt det der jeg kiggede rundt på codeproject - her ikke andel i det ;)
Avatar billede Slettet bruger
28. maj 2006 - 21:57 #19
okai, undrede mig også den var lavet i *host* VB *host* ;)
Avatar billede md_craig Nybegynder
28. maj 2006 - 22:19 #20
Der er i bunden en der referere til en anden "threadpool" klasse, som er i C# hvis det er mere interessant

http://www.bearcanyon.com/dotnet/#threadpool
Avatar billede Slettet bruger
28. maj 2006 - 22:38 #21
okay det kigger jeg lige på tak..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester