Donnerstag, 24. Mai 2012, 10:17

Du bist nicht angemeldet.



GBunge

hat sich gut eingelebt.

  • »GBunge« ist der Autor dieses Themas

Beiträge: 79

Architektur: 32-bit

  • Private Nachricht senden

1

Dienstag, 13. Mai 2008, 19:08

binäre Daten über das Netz senden

Hallo,
in den letzten Tagen habe ich versucht eine InterprozessKommunikation
mit der Qt3-Klasse 'QServerSocket' zu programmieren.
Hat auch soweit geklappt, mit Beispieldaten ( Strings ).

Nun möchte ich aber echte Daten austauschen keine Strings und nun komme ich nicht mehr weiter.
Der einzelne Datensatz enthält drei Integer-Werte und ist in einer Struktur zusammen gefasst.
Die Zeiger auf jeden Datensatz (Struktur) liegen in einer QPtrList<Daten>.

Mein Ansatz war, einen char-Pointer zu definieren und die Datensätze gecasted zuzuweisen

Quellcode

1
char *buf = (char*)datenListe.first();

und diesen char-Pointer und die Länge des Puffers an den Server zu senden.

Doch leider ist mir dabei offensichtlich ein Denkfehler passiert.
Nichts geht, nichts wird übertragen.

Kann jemand helfen?
Gruss GBunge

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »GBunge« (31. Mai 2008, 12:33)


stefan315

hat hier 2. Wohnsitz.

Beiträge: 423

Ubuntu: ---

Kernel: 2.6.39-ARCH

Desktop: KDE

Architektur: ---

  • Private Nachricht senden

2

Dienstag, 13. Mai 2008, 21:12

Ich kenne mich mit Qt3 nicht aus. Wie sendest den du die Daten?

Angenommen man hat eine Struktur:

typedef MyStruct
{
....
};

MyStruct Struktur;

(void *) Struktur --> Zeiger auf das erste Byte der Struktur.
Die Länge erhält man dann mit size(MyStruct).

Aber es fehlen da noch ein paar Infos:
Wie sendest du die Daten? Was ist DatenListe, bzw. DatenListe.first()?

GBunge

hat sich gut eingelebt.

  • »GBunge« ist der Autor dieses Themas

Beiträge: 79

Architektur: 32-bit

  • Private Nachricht senden

3

Mittwoch, 14. Mai 2008, 16:59

Hallo stefan315,

Qt stellt eine Interprocesscommunications Klasse zur Verfühgung.
Die Klasse heisst QServerSocket und nutzt die weitere Klasse
QSocket.
QSocket hat zwei Methoden:
writeBlock( const char * data, Q_UINT len );
readBlock( char * data, Q_UINT maxlen );
Diese beiden Methoden werden zum Senden und Empfangen genutzt.

Die Daten ( drei Integer ) stehen in einer Struktur.
Gleichartige Daten verschiedenner Objekte sind in einer
verketteten Liste 'DatenListe' zusammen gefasst.

DatenListe.first() ist ein Zeiger auf den ersten Datensatz der Liste.
Ich wollte nun folgende Zuweisung machen:

char * buf = (char*)Zeiger auf den ersten Datensatz.
Q_UINT len = Anzahl der Datensätze * sizeof( Struktur );

und diese beiden Werte mit writeBlock( buf, len ) senden.

GBunge

stefan315

hat hier 2. Wohnsitz.

Beiträge: 423

Ubuntu: ---

Kernel: 2.6.39-ARCH

Desktop: KDE

Architektur: ---

  • Private Nachricht senden

4

Samstag, 17. Mai 2008, 18:33

So gut kenne ich mit Netzwerkprogrammierung und Linux auch nicht aus.

Es ist aber wichtig, dass die Datensätze im Speicher direkt hintereinanderliegen. Ich denke nicht, dass das so ist. Dann müsstest du jeden Datensatz getrennt senden, oder du machst dir einen eigenenen Zusammenhängenden Speicherbereich. Z.b könntest du Speicher für Anzahl * sizeof(Struktur) anlegen und dann jeden Datensatz an die entsprechende Position kopieren. Z.b mit der Funktion kann man Speicherblöcke kopieren.

Es wird doch zu den Klassen sicher Beispiele und Tutorials geben. Die kannst du ja mal angucken.

Sonst kann ich dir auch nicht weiterhelfen. Eventuell kannst du ja mal in einem Programmierforum vorbeischauen. Da wird man dir sicher helfen können.