Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Peer-To-Peer ohne Portfreigabe (WinSock) (https://www.delphipraxis.net/149037-peer-peer-ohne-portfreigabe-winsock.html)

blablab 12. Mär 2010 21:20


Peer-To-Peer ohne Portfreigabe (WinSock)
 
Hallo!

Ich möchte ein kleines Programm schreiben mit dem man Dateien zwischen mehreren Benutzern übers Internet übertragen kann. Bis jetzt benutze ich Winsock und das alles geht über einen Server. Das bedeutet die Daten gehen immer zuerst zum Server und werden dann an den entsprechenden Client weitergeleitet. Wenn hier nur 2 Clients sich gegenseitig Daten senden, wird das ganze schon enorm durch die Übertragungsrate des Servers ausgebremst. Um das zu verhindern würde ich die Daten gerne direkt von Client zu Client senden, also Peer-to-Peer. Das Problem ist, dass ich das bis jetzt nur so kenne, dass dazu die Clients Ports freigeben müssen. Das wiederum bedeutet, wenn jemand hinter einem Router sitzt muss er erst bei dem Router diesen Port freigeben. Und leider kriegt das nicht jeder hin und außerdem bin ich da selbst auch erstmal skeptisch, wenn ich für ein Programm als erstes einen Port freigeben muss. Deshalb frage ich mich, ob das auch irgendwie anders geht???
Kann ich Daten Peer-To-Peer versenden ohne vorher einen Port freizugeben? Von mir aus auch mit Portfreigabe aber irgendwie automatisiert, so dass der Benutzer nicht erst seinen Router einstellen muss. Gibt es da irgendeine Möglichkeit?

Ich frag mich auch wie das ganze denn beim normalen Surfen im Internet funktioniert. Da werden doch auch Daten von fremden Server empfangen und gesendet und dazu muss man doch auch nicht vorher einen Port freigeben...

Wie ihr seht kenn ich mich leider mit Netzwerken nicht besonders aus :(

Vielen Dank schonmal für eure Antworten!

Grüße
blablab

wicht 12. Mär 2010 21:30

Re: Peer-To-Peer ohne Portfreigabe (WinSock)
 
Ich glaube du müsstest UDP verwenden. Über den Server tauschen die Clients dann nur ihre IPs aus, und versuchen sich über UDP dann zu kontaktieren. Ich meine das fällt unter das Thema "stateful" Firewall. Erkundige dich mal danach :)

Hier isses: http://de.wikipedia.org/wiki/Statefu...ei_UDP-Paketen

HTH

blablab 12. Mär 2010 21:53

Re: Peer-To-Peer ohne Portfreigabe (WinSock)
 
Eine (:stupid: dumme :stupid:) Frage vorab hätte ich dazu:
Kann ich davon ausgehen, dass ein UDP-Paket ankommt und dass es keine Übertragungsfehler gibt?
Also mit "nicht ankommen" meine ich natürlich nicht, dass das Paket von einer Firewall gelöscht wird, sondern dass das Paket unterwegs einfach im Nirvana verschwindet...

Ich weiß dass bei TCP eine Verbindung aufbaut und wenn ich Daten sende, dann kommen diese auch richtig an (oder es tritt ein Fehler auf). Aber ich habe glaub ich mal gelesen, dass UDP-Pakete verloren gehen können. Und ich frage mich, ob ich bei UDP-Paketen so etwas wie eine Checksum brauche, oder ob dort auch durch das Protokoll dafür gesorgt wird, dass die Daten korrekt übertragen werden.

[Edit]
Ich versuche das gerade einmal auszuprobieren. Allerdings könnte das was werden... :-D
[/Edit]

XHelp 13. Mär 2010 04:38

Re: Peer-To-Peer ohne Portfreigabe (WinSock)
 
Zitat:

Zitat von blablab
Kann ich davon ausgehen, dass ein UDP-Paket ankommt und dass es keine Übertragungsfehler gibt?
Also mit "nicht ankommen" meine ich natürlich nicht, dass das Paket von einer Firewall gelöscht wird, sondern dass das Paket unterwegs einfach im Nirvana verschwindet...

Nein, davon kannst du nicht ausgehen.
UDP-Protokoll besitzt werde Mechanismen zur Fehlererkennung/-beseitigung noch gibt es eine Empfangsbestätigung.
Jedes Paket nimmt (kann) übrigens einen anderen Weg durchs Netzwerk. Du kannst also nicht mal garantieren, dass die Pakete in der Reihenfolge ankommen, in der du diese geschickt hast (du schickst P1, P2, P3 und es kommt an P2, P3, P1)

Portfreigabe bzw. allgemein Verbindungsaufbau ist einer DER Themen im p2p Bereich. Und es ist alles andere als trivial. Deswegen wirst du nicht ohne weiteres dir selber eine super Lösung zurecht bauen können. Ließ dir am besten Dokumentationen über offene p2p Netzwerke wie die es regeln (Stichwörter: STUN, UDP-Hole punching)

P.S. Beim Surfen baust du ja eine Verbindung zum WebServer auf. Bei dem WebServer muss der Port freigegeben werden, sonst wird das Ganze nicht funktionieren. Und sobald du eine Verbindung aufgebaut hast, kannst du (über TCP) in beide Richtungen senden.

blablab 13. Mär 2010 14:52

Re: Peer-To-Peer ohne Portfreigabe (WinSock)
 
Danke für die Antwort, das hat mir sehr weitergeholfen. Ich bin die ganze Zeit am überlegen wie ichs jetzt machen soll...
Ich hab das jetzt so verstanden, dass das ganze ziemlich kompliziert ist und eigentlich gar nicht geht (bzw. gehen soll), man aber tricksen kann. Ich denke das ist mir aber zu viel Aufwand, weil ich wie gesagt nur ein "kleines Programm" schreiben möchte. Und allein die Umstellung von TCP auf UDP bedeutet wahrscheinlich schon einen riesen Aufwand. Ich weiß nicht ob ich so viel Zeit investieren möchte/kann. Und irgendwie gefällt mir die Vorstellung nicht "rumzutricksen". Ich will ja dass das Programm dann zuverlässig ist und ich weiß nicht ob das dann auch klappt.
Das bedeutet das Problem, dass der Server zu langsam ist, bleibt. Was eben auch sehr nervt ist, dass wenn ein Client eine sehr schlechte Internetverbindung hat, kann dieser die anderen Clients stark ausbremsen.
Leider fällt mir auch keine Lösung dazu ein...

Vielleicht habt ihr ja irgendwelche Ideen!?! :-D

XHelp 14. Mär 2010 12:55

Re: Peer-To-Peer ohne Portfreigabe (WinSock)
 
Um dir eine genaue Antwort zu geben, sind leider viele Sachen unbekannt:
- wie groß dein "p2p Netzwerk" sein soll
- wie groß die Dateien in der Regel sind
usw.

Du könntest z.b. einfach nur einen anderen Server benutzen. Selber einen zur Verfügung stellen ist nicht so ganz das wahre, weil du dann an die (vermutlich) DSL Geschwindigkeit gebunden bist. Also könntest du bei ebay nach einem billigen Hosting suchen. I.d.R. haben die eine bessere Leitung.

Du kannst auch dein Programm auf ICQ oder Jabber aufbauen. Dann brauchst du dich selber um weniger Sachen kümmern.

Du kannst aber auch einfach nur eine gute Anleitung für Routereinrichtung erstellen.

Luckie 14. Mär 2010 18:08

Re: Peer-To-Peer ohne Portfreigabe (WinSock)
 
Zitat:

Zitat von blablab
so dass der Benutzer nicht erst seinen Router einstellen muss.

Nach dem Motto: "Was der Benutzer nicht weiß, macht ihn nicht heiß"? Also bevor der Benutzer seinen Router selber richtig konfiguriert, soll dein Programm heimlich den Router umgehen? Und das macht dich weniger misstrauisch, als wenn du den Port selber von Hand freigeben musst?

Namenloser 14. Mär 2010 18:54

Re: Peer-To-Peer ohne Portfreigabe (WinSock)
 
Zitat:

Zitat von Luckie
Nach dem Motto: "Was der Benutzer nicht weiß, macht ihn nicht heiß"? Also bevor der Benutzer seinen Router selber richtig konfiguriert, soll dein Programm heimlich den Router umgehen? Und das macht dich weniger misstrauisch, als wenn du den Port selber von Hand freigeben musst?

Sag mal dem Ottonormalnutzer, er soll in seinem Router einen Port forwarden. Der wird dich aber mit großen Augen anschauen :mrgreen:

XHelp 14. Mär 2010 21:21

Re: Peer-To-Peer ohne Portfreigabe (WinSock)
 
Zitat:

Zitat von NamenLozer
Sag mal dem Ottonormalnutzer, er soll in seinem Router einen Port forwarden. Der wird dich aber mit großen Augen anschauen :mrgreen:

Naja, und wieviele Ottonormalnutzer sind auf p2p angewiesen und haben auch keine einzige Person im Umfeld, die dennen weiterhelfen kann?

Und außerdem sind
"stell im Router ein Port forward ein"
und
"Bitte richten Sie im Router eine Portweiterleitung ein. Für mehr Informationen lesen Sie bitte das Benutzerhandbuch des Routers oder fragen Sie Ihren Internetanbieter"
völlig verschiedene Sachen.

BUG 14. Mär 2010 22:43

Re: Peer-To-Peer ohne Portfreigabe (WinSock)
 
Man kann PortForwarding auch über UPnP erledigen.
Wer sich die Mühe machen will, könnte diesen Code (C#) übersetzen oder selbst umsetzen (und dann selbstlos der DP überlassen :mrgreen: ).

Der "Ottonormalnutzer" hat UPnP sicher nicht manuell abgeschaltet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz