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.
QTcp Socket Datenaustausch
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: QTcp Socket Datenaustausch
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...
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
'Funktioniert nicht' ist keine Fehlerbeschreibung
-
MADsCIENTIST
Re: QTcp Socket Datenaustausch
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
=> 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
... 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??????????????
Qt angefangen habe, weiß ich trotzdem das für jede Verbindung (pro Client) ein eigener
QTcpSocket verwendet wird
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
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
Der Ansatz ist nicht schlecht, aber NICHT SUCHEN sondern ERMITTELN.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!
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);
...
-
MADsCIENTIST
Re: QTcp Socket Datenaustausch
Sehr schön^^... werde das auch gleich ausprobieren, sobald ich paar andere Sachen noch gefixt habe!
Re: QTcp Socket Datenaustausch
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 ...
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
Das nur als Anregung ....
Ciao ...