Seite 1 von 1

QTcp Socket Datenaustausch

Verfasst: 13. April 2013 15:11
von MADsCIENTIST
Hallo liebe Community,

mein eigener Server ist jetzt schon fast einsatzbereit, jetzt geht es nur noch um das Senden und
Empfangen von Nachrichten/Daten!

Ich habe jeweils eine server- als auch clientseitige Anwendung. Jede der beiden soll bei einer
spezifischen Anfrage entweder eine Datei (*.txt, *.doc, etc.) bzw. eine Datenstruktur (struct)
an die anfragende Seite schicken.

1. Wie kann ich abfragen, was gesendet werden soll (struct oder richtige Datei)?
2. Gibt es ein SIGNAL seitens QTcpServer/QTcpSocket, das mir mitteilt, wenn eine Datenanfrage
gesendet wurde?, oder muss ich das immer mittels einer Schleife zeitlich überprüfen ob Bytes
vorhanden sind?
3. Wie sorge ich dafür, das bei der Datenübertragung sich nicht die Bytes irgendwie vermischen?
Wenn das überhaupt möglich ist!, aber wenn ein write() vorgang noch nicht abgeschlossen wurde
und der nächste schon ansteht, dann müssten die sich doch eigentlich überlagern?

Bedanke mich für sinnvolle Hilfe schon mal im Voraus.

Re: QTcp Socket Datenaustausch

Verfasst: 14. April 2013 08:28
von Christian81
1. QTcpSocket bzw. Tcp im Allgemeinen ist ein Datenstrom. Was Du wie darüber versendest ist deine Sache also musst Du dich auch drum kümmern.
2. Siehe Doku zu QTcpSocket
3. Jede Verbindung macht einen eigenen QTcpSocket auf, wo ist also das Problem
Deine Fragen zeigen mir, dass Du die Grundlagen der QTcpSocket/Server noch nicht wirklich verstanden hast. Schau Dir bitte erst die von Qt mitgelieferten Beispiele an...

Re: QTcp Socket Datenaustausch

Verfasst: 14. April 2013 17:09
von MADsCIENTIST
Also mal davon abgesehen, das ich erst diese Woche Do. mit Netzwerkprogrammierung in
Qt angefangen habe, weiß ich trotzdem das für jede Verbindung (pro Client) ein eigener
QTcpSocket verwendet wird :wink: => Ich hatte ja geschrieben das meine Server- und
Clientsoftware schon fast fertig ist, nur das halt ich die Sache mit dem Datenaustausch noch
nicht implementiert habe, weil ich nicht einfach per write() sinnlos Bytes verschicken will!

Ich wollte lediglich einen Ansatz, wie ich vorgehen könnte diese Daten so zu schicken, das
der Empfänger auswerten kann, ob es sich jetzt um eine Datei oder etwas anderes (QString)
handelt und dies dann entsprechend behandelt :D ... soviel dazu!

Was ich machen würde ist, das ich in ein QByteArray einen QString, sagen wir "MESSAGE" und
dahinter die entsprechende Message anhänge. Das schicke ich dann blockweise zum
Empfänger welcher nach einem Stichwort, in diesem Fall "MESSAGE" am übertragenen
QByteArray -to-> QString sucht und falls gegeben dementsprechend weitermacht!

Oder was wäre sinnvoller/effektiver??????????????

Re: QTcp Socket Datenaustausch

Verfasst: 14. April 2013 20:36
von veeman
MADsCIENTIST hat geschrieben: Was ich machen würde ist, das ich in ein QByteArray einen QString, sagen wir "MESSAGE" und
dahinter die entsprechende Message anhänge. Das schicke ich dann blockweise zum
Empfänger welcher nach einem Stichwort, in diesem Fall "MESSAGE" am übertragenen
QByteArray -to-> QString sucht und falls gegeben dementsprechend weitermacht!
Der Ansatz ist nicht schlecht, aber NICHT SUCHEN sondern ERMITTELN.
Da es bei Tcp um einen Stream handelt ist auch sichergestellt dass die Daten sequenziell ankommen, dh genau so wie du write aufrufst genauso kommen sie auch mittels read wieder an.

Ich Zitiere mal aus diesem Beispiel:

Code: Alles auswählen

    QDataStream in(tcpSocket);
    in.setVersion(QDataStream::Qt_4_0);

    if (blockSize == 0) {
        if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
            return;
        in >> blockSize;
    }

    if (tcpSocket->bytesAvailable() < blockSize)
        return;

    ....
    char *buffer = new char[blockSize];
    tcpSocket->read(buffer, blockSize);
    ...
<- Hier werden die blockweiße gesendete Daten ausgelesen.

Re: QTcp Socket Datenaustausch

Verfasst: 15. April 2013 22:20
von MADsCIENTIST
Sehr schön^^... werde das auch gleich ausprobieren, sobald ich paar andere Sachen noch gefixt habe!

Re: QTcp Socket Datenaustausch

Verfasst: 17. April 2013 08:46
von RHBaum
Als Neueinsteiger bei der Netzwerk-Kommunikation tut man sich natürlich schon noch schwer :-)

Eine (oder mehrere) TCP Verbindung(en) aufzubauen ist dabei die kleinste Hürde. Das wird einem auch in jedem Kurs/Buch ala "networking for dummies" beigebracht.
Der wesentlich Wichtigere teil, und damit eigentlich der Kern deiner Probleme, ist das (auf TCP aufsetzende) Protokoll ....

Und da gibts ne Menge abzuwägen. Performance vs. kompatiblitaet vs. Sicherheit vs. Debugg/Logging .....

DIe erste grosse Frage, nachdem man sich fuer TCP entschieden hat, ist dann meist:
- Textbasierend vs. binaeres Protokoll
- Zustandsbasierendes vs. Zustandsloses Protokoll ....
....

Nen guter EInstiegspunkt ist, sich andere Protokolle anzuschauen, deren Probleme und Ideen etc.
nen recht einfaches textbasierendes ist zum Beispiel http oder auch smtp, dazu gibts zu den trockenen rfc's zum glück auch weitere Literatur.
Dort kann man sich genug anregungen holen, z.b. auch wie man ne datei ueber textbasierende Protokolle transportiert

ftp (old version) z.b. ist nen beispiel fuer nen zwitter Protokoll (Controll-kanal + datenkanal)

Für binaere protokolle wirst weniger Beispiele und Literatur finden, weil die meisten propertiäre Loesungen sind, dort der Hauptaugenmerk auf Performance / Verschleierung liegt, oft weniger auf ne sauebere Protokollspec.

Das beste ist meist, nen schon vorhandenes Protokoll zu nehmen, wenn möglich. da spart man sich ne Menge :-) allein schon die Spec zu schreiben. Oft gibts dann auch libs ...

Das nur als Anregung ....

Ciao ...