QTcpSocket verbindet nur lokal

Alles rund um die Programmierung mit Qt
Antworten
wirbelsturm
Beiträge: 3
Registriert: 9. August 2009 17:25

QTcpSocket verbindet nur lokal

Beitrag 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
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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?
wirbelsturm
Beiträge: 3
Registriert: 9. August 2009 17:25

Beitrag 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?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Und würde es dann mt UDP funktionieren?
ja genau.... siehe
http://www.heise.de/security/artikel/Wi ... 70856.html
wirbelsturm
Beiträge: 3
Registriert: 9. August 2009 17:25

Beitrag 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?
arj
Beiträge: 45
Registriert: 1. Juni 2009 13:51
Wohnort: Ihringen

Beitrag 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
Antworten