Hallo zusammen
Ich habe ein kleines Chat-Programm geschrieben. Das Programm funktioniert so, dass es zuerst versucht eine Verbindung zu einem Server zu erstellen(mithilfe von QTcpSocket). Wenn es nach zwei Sekunden nicht verbunden ist, wird es selbst zu einem Server(QTcpServer) .Wenn ich das ganze lokal laufen lasse(mit der ip 127.0.0.1) funktioniert es einwandfrei. Versuche ich aber eine Verbindung mit einer ip aus dem lokalen Netzwerk( z.B 192.168.1.33) zu erstellen, so nimmt der QTcpSocket das ohne Probleme an. Der QTcpServer aber reklamiert, die Adresse sei nicht gültig("The address is not available"). Ich hoffe ihr könnt mir helfen.
P.S bitte seit nicht zu hart wenn dieser Fehler für euch absolut klar ist, das ist mein erstes (richtiges) Programm mit Qt
Mfg wirbelsturm
QTcpSocket verbindet nur lokal
-
- Beiträge: 3
- Registriert: 9. August 2009 17:25
Danke solarix das war das Problem. Ich habe es nun behoben(QTcpServer hört nun auf QHostAddress::Any). Das Programm funktioniert jetzt.
Allerdings habe ich nun das Problem, dass wenn ich eine Verbindung zwischen zwei Rechnern herstellen will(die beide hinter Routern sind), ich immer eine Portumleitung im Router definieren muss. Es versteht sich ja von selbst, dass dies relativ umständlich ist.
Wie kann ich dieses Problem lösen?
EDIT:
Ich dachte es funktioniert folgendes:
Mein Programm fragt jeden Nutzer zuerst nach der IP und dem Port des anderen Benutzers. Dann versucht es zuerst eine Verbindung mit QTcpSocket zum anderen herzustellen. Gelingt das nicht erstellt es einen Server der auf dem angegebenen Port hört.
Nun versucht Person A eine Verbindung zu Person B auzubauen, die die IP b.b.b.b und den Port x verwendet. Der Router von B blockt diese Verbindung. Dafür leitet der Router von A nun alles was von b.b.b.b zum Port x kommt an den Rechner von A. Wenn B nun versucht eine Verbindung zu a.a.a.a durch den Port x, leitet sie der Router von A weiter zum Rechner von A. So wird eine Verbindung aufgebaut.
Anscheinen funktioniert dass so aber nicht. Überprüft der Router die Sequence Number und die Acknowledgment Number, und es funktioniert es deshalb nicht? Und würde es dann mt UDP funktionieren? Oder mache ich einfach etwas falsch? Ich habe dieses Prinzip mal in einem Artikel gelesen, deshalb denke ich es muss funktionieren, aber wie?
Allerdings habe ich nun das Problem, dass wenn ich eine Verbindung zwischen zwei Rechnern herstellen will(die beide hinter Routern sind), ich immer eine Portumleitung im Router definieren muss. Es versteht sich ja von selbst, dass dies relativ umständlich ist.
Wie kann ich dieses Problem lösen?
EDIT:
Ich dachte es funktioniert folgendes:
Mein Programm fragt jeden Nutzer zuerst nach der IP und dem Port des anderen Benutzers. Dann versucht es zuerst eine Verbindung mit QTcpSocket zum anderen herzustellen. Gelingt das nicht erstellt es einen Server der auf dem angegebenen Port hört.
Nun versucht Person A eine Verbindung zu Person B auzubauen, die die IP b.b.b.b und den Port x verwendet. Der Router von B blockt diese Verbindung. Dafür leitet der Router von A nun alles was von b.b.b.b zum Port x kommt an den Rechner von A. Wenn B nun versucht eine Verbindung zu a.a.a.a durch den Port x, leitet sie der Router von A weiter zum Rechner von A. So wird eine Verbindung aufgebaut.
Anscheinen funktioniert dass so aber nicht. Überprüft der Router die Sequence Number und die Acknowledgment Number, und es funktioniert es deshalb nicht? Und würde es dann mt UDP funktionieren? Oder mache ich einfach etwas falsch? Ich habe dieses Prinzip mal in einem Artikel gelesen, deshalb denke ich es muss funktionieren, aber wie?
ja genau.... sieheUnd würde es dann mt UDP funktionieren?
http://www.heise.de/security/artikel/Wi ... 70856.html
-
- Beiträge: 3
- Registriert: 9. August 2009 17:25
Es ist sehr kompliziert aber unter umständen möglich. Das ganze nennt sich TCP Hole Punching. Die Erfolgsquote ist aber meist nicht soo gut (bei UDP wesentlich besser, wegen der fehlenden Verbindung)
Hier findest Du ab Folie 17 ein paar Infos: http://cone.informatik.uni-freiburg.de/ ... p2p-07.pdf
Hier findest Du ab Folie 17 ein paar Infos: http://cone.informatik.uni-freiburg.de/ ... p2p-07.pdf