QTcp Socket Datenaustausch

Alles rund um die Programmierung mit Qt
Antworten
MADsCIENTIST

QTcp Socket Datenaustausch

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QTcp Socket Datenaustausch

Beitrag 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...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
MADsCIENTIST

Re: QTcp Socket Datenaustausch

Beitrag 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??????????????
veeman
Beiträge: 280
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: QTcp Socket Datenaustausch

Beitrag 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.
MADsCIENTIST

Re: QTcp Socket Datenaustausch

Beitrag von MADsCIENTIST »

Sehr schön^^... werde das auch gleich ausprobieren, sobald ich paar andere Sachen noch gefixt habe!
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QTcp Socket Datenaustausch

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