Seite 1 von 1

[gelöst] QTcpServer und QTcpSocket Basics

Verfasst: 15. April 2016 18:06
von bobcat
Ok, eine Anfängerfrage zum Verständnis ...:
Ich möchte mittels TCP zwischen zwei Prozessen auf einem Rechner kommunizieren. Der eine Prozess benutzt einen QTcpSocket und verbindet sich mit dem Host:

Code: Alles auswählen

QTcpSocket socket;
QHostAddress ip("127.0.0.1");
int port = 1212;
socket.connectToHost(ip, port);
Kann ich im zweiten Prozess das gleiche machen, d.h. einen QTcpSocket auf dieselbe Adresse und denselben Port verbinden? Oder muss der zweite Prozess einen QTcpServer bieten, der auf der 127.0.0.1 listened und dann bei eingehender Anfrage einen QTcpSocket* liefert? (Wenn ich ein ping 127.0.0.1 absende, dann bekomme ich ja jetzt schon eine Antwort, auch ohne dass ich extra einen Server auf der Adresse eingerichtet habe).
Mit anderen Worten: Könnte ich zwei Sockets direkt miteinander verbinden oder brauche ich immer einen Server?

Re: QTcpServer und QTcpSocket Basics

Verfasst: 16. April 2016 14:35
von Christian81
Es ist immer ein Server und mindestens ein Client nötig. Beispiele dazu gibt es hier: http://doc.qt.io/qt-5/qtcpserver.html#details

Re: [gelöst] QTcpServer und QTcpSocket Basics

Verfasst: 18. April 2016 10:10
von RHBaum
Mit anderen Worten: Könnte ich zwei Sockets direkt miteinander verbinden oder brauche ich immer einen Server?
Leider versteckt hier Qt viele Details, bzw. macht es dir extrem komfortabel ^^

Native Sockets (BSD Sockets, winsock) gibts keine Trennung zwischen Client und Server an dem Socket Construkt.
Aber es gibt mehrere Modis, wie man nen Socket zum connecten bekommt. Und da ist "Server" und "Client" unterschiedlich.
der client kann meist direkt mit connect auf nen Serversocket drauf ... der Server muss dazu vorher in den list modus gebracht werden und dann die verbindung entgegennehmen oder ablehnen (bind - listen - accept) ...
Und das ist auch der Hintergrund der Begrifflichkeiten ... Server ist immer der im "listen" modus, der bei verbindungsanfragen den call bekommt, und dann nen neuen socket für die angenomme verbindung erzeugen kann (accept) und dabei weiter den listener socket wieder im listen modus weiterlaufen kann (server für multiple verbindungen).
Der connect kann das nicht, der bricht nur nach timeout oder Ablehnung ab, oder verbindet halt (error code).
auch bei gutem timing schaffst es nicht 2 sockets via 2 x connect zu verbinden, nur über die verfahren geregelt ist, wer die vebindung initiiert und wer bestätigt (Acknowledge) im TCP Handschake.

Hoffe das hilft das ganze bissi zu verstehen ^^

Ciao ...