Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Ghandi

Treue Seele

  • »Ghandi« ist der Autor dieses Themas

Beiträge: 218

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

1

08.08.2003, 12:54

Organisation von multiplen Datentrasfer über Netzwerk

Klingt das nicht schön hochgestochen? :)

Aber zu meinem ernsten Problem: Ich bin dabei ein Dateidownloadprogramm zu schreiben (sowas ähnliches wie kazaa). Dabei gibt es ein Server- und ein Clientprogramm. Der Server stellt die Daten/Dateien bereit und der Client kann sie Runterladen, natürlich soll der Client mehrere Dateien gleichzeitig runterladen können und die Downloads sollen auch Pausierbar und abbrechbar sein (fortsetzbar natürlich auch). Der Server macht das selbe, nur das er eben die Daten verschickt, er kann aber auch die Downloads pausieren und abbrechen und auch die Geschwindigkeit festlegen. Zudem kann es (oder wird es) sein das mehrere Benutzer dateien runterladen. Also richtig wie Kazaa halt. Ich wollte wissen wie man dabei den Daten-/Dateientransfer organisiert.

1. Soll ich für jeden Download einen extra Thread starten, oder soll es nur beim Server für jeden Benutzer einen extra Thread geben, oder soll ich vielleicht völlig ohne Threads arbeiten?
2. Wenn ich nich für jeden extra Download einen Thread starte, wie mach ich das dann das jeder seinen Platz auf der Bandbreite bekommt?

Ich bevorzuge ja die Version mit einem Thread für jeden einzelnen Download, allerdings werden es meistens extrem wiele Downloads sein...Deshalb die dritte Frage:

3. Wieviele Threads kann/sollte ein Program haben?
Alles ist gut so wie es ist, am besten ist jedoch das niemand dies akzeptiert.

error C2039: 'DerSinn' : ist kein Element von 'CLeben'

2

08.08.2003, 18:08

Jede Verbindung bekommt seinen eigenen Port. Ob dieser Port zu verschiedenen oder alle zu einer IP Adresse gehören ist völlig egal. Ein Programm kann ja locker mal eben 20 Verbindungen haben.

Du legst für jede Verbindung einen eigenen Thread an. Sowohl für den Server als auch für den Client. Jeder Thread Organisiert sich selber. Auf eine Globale Liste würd ich nett setzen. Das gibt sonst sehr viele Syncronsisationsprobleme und du läufst gefahr das sich dein Programm selber blockt. Das wird dann auch en netter selbst läufer. Wenn ein Download/Upload beendet ist, beendet sich der Thread einfach selber.

Der Ablauf währe dann etwa so.
- Client connected zum Server
- Server erstellt einen neuen Thread
- Client erstellt einen neuen Thread
- Thread läuft solange bis Download beendet ist (Client/Server)
- Thread beendet sich selber (Client/Server)

Ich würd vieleicht nur einen File Manager basteln. Der Multithreading fähig ist. Damit es hier keine Probleme gibt. Dieser sorgt dann dafür das alle Thread auf eine Datei lesen können, aber nur dann geschrieben wird, wenn keiner mehr liest und der Thread auf freigabe wartet. Des weiteren ist es seine Aufgabe die Cursor Position zu setzen. Schließlich soll ja auch die Möglichkeit gegeben sein den Download mitten drin abzubrechen. Der File Manager speichert dann natürlich auch die letzte Position.

Die Bandbreite wird dann Automatisch auf alle Verbindungen verteilt. Hier einen Manager einzubauen, würd ich erst einmal lassen. Kann man bei bedarf ja dann immer noch machen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

3

08.08.2003, 18:20

threading ist dafür schlecht, benutz lieber select.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

08.08.2003, 18:27

Threads sind aber sehr fortschrittlich, da man dabei auch eventuelle Multiprozessorfähigkeiten ausnutzen kann. Zur Frage mit der maximalen Anzahl von Threads: Ich glaube nicht, dass es da von vornherein eine Grenze gibt (klar gibt es eine Grenze, aber die ist eher "physisch"). Ich habe gerade z.B. 460 Threads gleichzeitig auf dem PC laufen, und das bei nur ein paar Standardprogrammen.

5

08.08.2003, 18:43

460 Threads? Wow... im Moment hab ich grad mal 41 Thread laufen. Bei 12 Programmen im Hintergrund und 5 Normalen inkl. diesem ;) Was haste denn für Progs?
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Tobiking

1x Rätselkönig

  • Private Nachricht senden

6

08.08.2003, 19:48

Ich glaube da wird was verwechselt. Ich habe 37 "Prozesse" und auch viele Threads und zwar 564. Naja ich habe Apache Server laufen IRC Virenscanner InCD ... Ich frage mich nur ob das mit dem Ports stimmt. Weil Programme wie Kazaa und Emule laufen mit 1 oder maximal 4 Ports. Und man hat zig Downloads an. Da gibt es bestimmt ne bessere Möglichkeit.

Ghandi

Treue Seele

  • »Ghandi« ist der Autor dieses Themas

Beiträge: 218

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

7

08.08.2003, 20:31

Man eröffnet nicht für jeden user einen eigenen Port, aber einen eigenen Socket, ich überlege ob ich vielleicht auch für jede Datei einen eigenen Socket öffnen sollte...also ich denke ich kann auf jeden Fall für jeden Benutzer einen eigenen Thread anlegen, aber meint ihr es wäre sinnvoll auch für jede datei einen eigenen Thread anlegen sollte+eigenen Socket?
Alles ist gut so wie es ist, am besten ist jedoch das niemand dies akzeptiert.

error C2039: 'DerSinn' : ist kein Element von 'CLeben'

8

09.08.2003, 01:16

Zitat von »"Tobiking"«

Ich glaube da wird was verwechselt. Ich habe 37 "Prozesse" und auch viele Threads und zwar 564.
Stimmt hast recht. Da hab ich wircklich was verwechselt. :jojo:

Aber für jedes File einen eigenen Thread anzulegen, ist glaub ich nett nötig. Aber man kann es ja noch etwas anders lösen. Man gibt jedem Download eine ID. Diese ID schickt man dann mit seinem Datenpacket ab. Der Client weis dann zu welcher Datei die Daten gehören. Man würde dann die zu Downloadende Datei in mehrere Stücke zerlegen und die dann versenden. Ein mögliche Header könnte dann so ausehen

Quellcode

1
2
3
4
5
6
struct Header
{
  __int32 ID;                    // ID des Download files
  unsigned long startPos;   // Dateiposition der Daten
  unsigned long DataSize;  // Größe der Daten in Byte
};
Danach würden dann die Daten verschickt. So könnte man mit einer Verbindung gleich mehrere Dateien verschicken und Organisieren. Z.B. nach Priorität. Dann würde ein Thread pro User auch reichen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Ghandi

Treue Seele

  • »Ghandi« ist der Autor dieses Themas

Beiträge: 218

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

9

09.08.2003, 11:12

Was jetz vielleicht nicht ganz reinpasst, aber mir fällt es gerade auf. Wozu die unterstriche vor manchen Datentypen, hat das eine Tiefere Bedeutung?

So jetz aber wieder zum Thema...mehr oder weniger.

Gibt es eine möglichkeit einen beliebigen Datentyp in einen String umzuwandeln, zu verschicken und dann wieder zurückzuwandeln?
Alles ist gut so wie es ist, am besten ist jedoch das niemand dies akzeptiert.

error C2039: 'DerSinn' : ist kein Element von 'CLeben'

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

09.08.2003, 11:21

Zitat von »"Ghandi"«

Wozu die unterstriche vor manchen Datentypen, hat das eine Tiefere Bedeutung?

Ich glaube das sind compilerspezifische Typen, bin mir aber nicht sicher.

Zitat von »"Ghandi"«

Gibt es eine möglichkeit einen beliebigen Datentyp in einen String umzuwandeln, zu verschicken und dann wieder zurückzuwandeln?

Wozu willst Du das tun? Warum schickst Du nicht einfach die Daten an sich als BYTE-Buffer über's Netzwerk???

Werbeanzeige