Seite 1 von 1

QTcpSocket verbindet nur lokal

Verfasst: 20. Oktober 2009 21:02
von wirbelsturm
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

Verfasst: 20. Oktober 2009 23:18
von solarix
Du fütterst QTcpServer::listen aber hoffentlich nicht mit der Adresse des anderen Rechners.. oder? Kannst du mal den Codeabschnitt des QTcpServers zeigen?

Verfasst: 23. Oktober 2009 23:01
von wirbelsturm
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?

Verfasst: 24. Oktober 2009 17:13
von solarix
Und würde es dann mt UDP funktionieren?
ja genau.... siehe
http://www.heise.de/security/artikel/Wi ... 70856.html

Verfasst: 24. Oktober 2009 22:06
von wirbelsturm
Und gibt es keine möglichkeit das ganze mit TCP zu machen? Eine möglichkeit wäre doch noch die Sequence Number und die Acknowledgment Number zu manipuliren, auch wenn es ziemlich umständlich wäre. Was halter ihr davon?

Verfasst: 25. Oktober 2009 17:41
von arj
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