Chat in C++?
-
Ich erkläre es gerne noch mal auf Deutsch:
Aaaalso:
Gegeben:
Computer 1
Computer 2
ServerGesucht:
Verbindung von Computer 2 an C1. (Anruf oder andere Peer-to-Peer-Anwendungen wie Chats)Lösung:
Computer 1 und 2 müssen sich auf einem Server registrieren. Das machen sie mit dem TCP-Protokoll über Port 80, der wegen HTTP sowieso immer offen ist und ein Handshake damit möglich wird. Der Server erfährt nun schon mal die IPs von Computer 1 und 2. Der Server sendet nun ein paar Test-Requests an Computer 2, um herauszubekommen, welchen Kommunikationsport C2 benutzen kann/will, um Daten zu senden. Wenn der Server den nun auch hat, schickt er IP und Port an C1. C1 kann nun starten, C2 zu kontaktieren. Also macht C1 einen UDP-Request an C2, z.B. an IP 99.999.999 Port 6666. Wenn der UDP-Request von C1 an C2 startet, haut dieser ein temporäres Loch ( = der Lieblings-Port von C1, z.B. 5555) in die eigene Firewall und der Request geht zu C2. Aber der Port 6666 von der Firewall von C2 ist geschlossen, der Request scheitert.

UDP ist das egal, während bei TCP eine Antwort ( =Shakehands) kommen muss, ist das bei UDP nicht notwendig. Aber diese Aktion hat 2 dolle Sachen gemacht: a) ein Loch in der Firewall von C1, was er sich selber durch seinen fehlgeschlagenen Request reingedonnert hat und b) C1 akzeptiert jetzt durch den Request alle Anfragen von C2 ( =99.999.999:6666) als Antwort, C1 ist jetzt offen für C2.
Jetzt ist der Server wieder dran: er schickt die Daten von C1 an C2 (IP und Port, z.B. IP 11.111.111 und der Port, wie oben, 5555). C2 macht jetzt auch einen UDP an 11.111.111:5555, haut sich auch ein Loch in die eigene Firewall und geht zum Loch 99.999.999:6666, er kann da durch, weil C1 denkt, dass C2 antwortet, da C1 ja einen UDP-Request an C2 gesendet hat. Jetzt haben beide ein Loch, beide haben Kontakt und der Server kann gehen.
Mal es dir nach meiner Beschreibung ruhig auf, wenn du es noch nicht verstanden haben solltest.

-
Ah k also das is mal ne verdammt gute Erklärung!Habs verstanden.Aber ich glaube fast an der Umsetung wirds scheitern...was muss ich mir denn für tutorials dafür angucken oda was muss ich googlen?
Vielen Dank schonmal für die gute Erklärung!
-
Das sind einfach nur Sockets, ich habe es aus "C++ von A bis Z", aber es gibt auch Tuts: In Deutsch
Was mich mal interessieren würde ist, wie man Audiodaten über UDP streamen kann.

-
Dann werd ich mich da mal durchfressen ^^
Danke
-
@Dravere:
OK - das PS iwo hab ich nich gesehen ^^ein letzter versuch noch ^^
"der komplett ohne Server oder so läuft" (jedenfalls hab ich noch nirgendwo gesehen, dass der TO sich umentschieden hat)
heißt, dass es nur irgendwo n (n=2!?) clients gibt.da man aber den server braucht, kann man als günstigen und einfachen ersatz eine Website dazu "missbrauchen".
das er gebraucht wird, sollte ja offensichtlich sein!?
dann kann man eben direkt beim starten nen http-request dort hinsenden. daraufhin erhält man die information, ob schon ein server läuft und ggf. die server-ip.
wenn noch kein server läuft, muss der client, der das request absendet, der server sein.so meinte ich das - und fand den ansatz eigtl recht elegant als ich es damals ma iwo gesehen hatte. nachteil erkenn ich auch keinen, da man nur ne domain (gibts ja genug möglichkeiten, eine kostenlos zu bekommen) braucht. dazu brauch man dann halt noch ca. 5KB Webspace - und daran sollte es nun auch nicht hängen

bb
-
Und einen Webspace, der CGI-C++-Codes akzeptiert. HAHA das kostet.

-
unskilled schrieb:
das er gebraucht wird, sollte ja offensichtlich sein!?
Das kommt darauf an ...
und zwar darauf, ob ich nur ein bißchen mit meinen Freunden chatten will, oder ob es etwas 'professionelleres' sein soll.Im ersten Fall mach ich einfach einen ServerSocket, maile meinen Kumpels meine IP, und ab geht's (vorher forwarde ich noch den entsprechenden Port in meiner Firewall).
PS Ich habe gehört, daß, wenn man INet über einen Unitymedia - Kabelanschluß betreibt, man immer die gleiche (eine feste) IP hat. Falls das stimmt, macht das die Sache noch einfacher.
-
Ad aCTa schrieb:
Und einen Webspace, der CGI-C++-Codes akzeptiert. HAHA das kostet.

dir ist klar, was ich mit website und php meine?
ip bei kabel:
naja - ich hab zwar lange zeit immer ne gleiche ip(auf jeden fall >24h), aber imho ist nicht garantiert, dass ich immer die selbe behalte...
wenn es wirklich nur so sein soll, dann www.dyndns.com
viele router können das auch direkt updaten, da muss man dann kein komisches programm laufen lassen ^^bb
-
Häää? PHP kann nicht mit dem Client kommunizieren. C++ schon. Mit PHP machst du das unnötig komplizierter, dann musst du erst noch HTTP benutzen.
-
Ad aCTa schrieb:
dann musst du erst noch HTTP benutzen.
sockets braucht man so und so - also kann man sich in 5 minuten diese funktionalität bauen... für das skript braucht man nochmal ca. 5 minuten.
dann bau das mal mit c++ nach - und dann ist es auch noch teurer... n1bb
-
@unskilled,
Dein Weg ist für arme Leute und extrem umständlich sowie extrem langsam. Schon nur das ständige Parsen von HTTP in beide Richtungen, dann noch das Parsen des Contents. PHP Ausführen, kostet auch noch viel Zeit und weil du per HTTP den Server erreichen können musst, musst du einen HTTP Webserver aufsetzen. Na viel Spass. Ich würde es keinem empfehlen.Und vor allem wie Belli schon sagte und wie ich es selber schon gesagt habe, kann ein Client auch direkt der Server sein. Erst recht wenn man am Anfang noch übt, ist das der einfachste und üblichste Weg.
@Ad aCTa,
Nochmals das Skype Prinzip? Reicht der Artikel denn wirklich nicht
Zudem würde ich diese Art der Verbindung nicht wirklich einem Anfänger empfehlen. Zuerst lieber das normale Server - Client Zeug über den Localhost, wie es im C Worker Tutorial auch erklärt ist. Aber naja ... ich wiederhole mich, ich werde alt ... oder so
Grüssli
-
> Nochmals das Skype Prinzip?
Naja, ist mehr das Peer-to-peer-um-Firewall-schleich-Prinzip, ob Skype das erfunden hat, weiß ich nicht. Ich habe es aufgeschrieben, da es ja einige auf Englisch nicht verstanden haben.