Archiv verlassen und diese Seite im Standarddesign anzeigen : Beliebig grosse Datenstruktur einlesen
Moin,
ich habe eine Datenstruktur (Struktur oder Klasse ist egal) in der, unter anderem,
ein beliebig langer String gespeicher werden kann. Dies habe ich mit einem
char-Zeiger und dem new-Operator realisiert. Diese Datenstruktur möchte ich jetzt
"versenden", z.B. in einem TCP-Socket-Programm. Wie kann ich aber eine solche
Datenstruktur z.B von einem Filediskriptor lesen. Mein Ansatz war die Funktion read(),
aber die benötigt die genau Anzahl von Bytes die gelesen werden sollen, aber diese Grösse
ist ja immer unterschiedlich (je nach länge des gespeicherten Strings).
Trillian
20-08-2002, 19:56
Geht's jetzt um Dateien oder Sockets? :D
Bei Sockets kann man sich AFAIK nie sicher sein, wieviele Byte gerade zum Lesen verfügbar sind, also schon verschickt wurden.
AFAIK geht man i.A. so vor, dass man einfach einige Bytes liest, und dann guckt, wieviel übertragen wurde.
Evtl mal "Maverick's Tips zur Socket Programmierung" lesen"´, falls du dich damit noch nicht so viel beschäftigt hast ;)
www.zotteljedi.de
Ich würd es in einer while/for Schleife realisieren. Du liest jeden Durchgang ein Byte ein und checkst auf \n oder EOF. Soblad du EOF oder \n findest hörst du auf zu senden. Und beim Empfänger liest du auch immer nur ein Byte. Kannst ja auch gleich 8byte chunks lesen, wenn du den string eh in heap liest. Das wär dann wohl effizienter ;) Hoffe mal dir ein wenig geholfen zu haben
--baegsch
Christoph
21-08-2002, 12:00
> Ich würd es in einer while/for Schleife realisieren. Du liest jeden Durchgang
> ein Byte ein und checkst auf \n oder EOF.
> Soblad du EOF oder \n findest hörst du auf zu senden.
>
Das geht zwar, ist aber sehr inperformant, weil keine Pufferung stattfindet.
Wenn Du große Datenmengen überträgst, dann bremst du damit dein Programm
dramatisch aus.
Wenn dein String-Delimiter ein Newline ist, dann kannst du fgets() nehmen
(vorher mit setbuf() den Puffermodus auf zeilenweises Puffern setzen).
Da auch fgets() eine Byte-Angabe bekommt, musst du ggf. fgets() mehrmals
aufrufen, solange bis am Ende ein \n steht.
Christoph
Trillian
21-08-2002, 19:12
Das geht aber wiederum nicht mit einem Socket :D
Für Sockets in C kann ich die glib (www.gtk.org) wärmestens empfehlen (eigentlich generell für C Kram :D), die hat sog. "IO Channels", die einem mit Sockets (funzt auch mit Pipes etc) viel Arbeit abnehmen kann).
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.