PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : recv() und send()



nta
07-06-2003, 17:27
hi

wenn ich daten empfange per recv(s, received_date, 1024, 0) muss ich ja die maximal länge der empfangenen daten kennen, aber ich kenne sie nicht wie kann ich das machen wenn ich vorher nicht weis wie gross die empfangen daten sein sollen??

hoffe mir kann einer helfen ...

phate
07-06-2003, 18:37
Hi nta,

Du musst nicht die Länge der eintreffenden Daten kennen, sondern nur die Länge Deines Puffers in den Du diese Daten einliest. Dass ist als Schutzmassnahme zu erachten, weil sonst Dein Puffer überlaufen könnte. Somit kannst Du ankommende Daten - ungeachtet der Länge - stückchenweise in einen Puffer - mit Dir bekannter Länge - einlesen und von dort verarbeiten.

D.h. Du musst überprüfen ob an dem von Dir gewünschten Socket Daten zum Lesen anliegen (per select() oder poll(), wobei ich bisher immer select verwendet habe), diese dann in Deinen Puffer einlesen und verarbeiten. Das ganze Prozedere dann solang, bis keine Daten mehr anliegen (Je nach Anwendungs-Protokoll Anfrage / Übertragung beendet, o.ä.).

Gruss,

phate

nta
07-06-2003, 19:57
hm ... dann kann ich den puffer ja dynamisch anlegen und nachdem ich mit select die grösse kenne kann ich den puffer ja dann auch anlegen. oder denke ich jetzt falsch?

phate
07-06-2003, 20:14
Nein, mit select() kannst Du lediglich überprüfen, ob Daten zum Lesen bereit stehen, nicht aber wieviel.

Du legst einen Puffer mit einem festen Bereich an, z.B.
#define MAXLINE 4095

char buf[MAXLINE + 1]
int byte_read = 0;
int sfd = 0;

...

// socket initialisieren, blabla
und rufst dann recv() auf, um zu lesende Daten bis zur maximalen Grösse in diesen Puffer zu übertragen.
byte_read = recv(sfd, buf, MAXLINE, 0);
buf[MAXLINE] = '\0';Damit hast Du erstmal byte_read Byte Daten aus dem Socket gelesen, die Du verarbeiten kannst, wie Du es brauchst.

Wenn Du nun per select() feststellst, dass noch weitere Daten am Socket zum Lesen vorliegen, dann wiederholst Du das Spielchen.

Siehe auch
man select()
man recv().

Du kannst auch mal im "Sprachen, Standard APIs"-Forum nach "select" suchen, da sollte sich was zu finden, falls Du noch nicht mit gearbeitet hast. Und google gibts natürlich auch noch.

Alle Klarheiten beseitigt? ;)

phate

nta
08-06-2003, 10:43
ok ... das hab ich ja kapiert mein prob is jetzt aber das was recv empfangen soll ein struct ist :



typedef struct _RecvData
{
char Name[12];
char *Text;
} RecvData


mein prob is ja dann das ich nicht weis wie gross text ist und ich wollte ja dann wissen wie gross es dann ist.

oder denk ich jetzt wieder total falsch ... ?!? :confused:

anda_skoa
08-06-2003, 11:09
Original geschrieben von nta
mein prob is ja dann das ich nicht weis wie gross text ist und ich wollte ja dann wissen wie gross es dann ist.


Wenn du eine Datenstruktur überträgts, deren Länge variabel ist, gibt es zwei Möglichkeiten.

1) am Anfang die Länge übertragen

2) das Ende eindeutig kennzeichnen.

Ciao,
_