Anfängerfrage char* buf
-
Visual 2008 Exp. c++
Hi,
wenn ich in der MSDN - Reference recv() folgendes lese:Winsock2.h (online)
int recv( __in SOCKET s, __out char *buf, __in int len, __in int flags );Winsock2.h (Winsock.chm):
int recv( SOCKET s, char FAR *buf, int len, int flags );wie sollte die Variable 'buf' angelegt werden?
//z.B. char Buffer[]; //oder char Buffer[irgendwas]; //oder std::string Buffer; //oder char *Buffer = New Buffer[] //oder TCHAR Buffer[] //usw.?Und wie groß darf/muss der Speicherplatz für *buf sein, bzw. wie kann man dieses selbst herausfinden/ bzw. wo nachlesen? oder gibt es Standardgrößen?
Und wie werden FAR-Zeiger deklariert?
Vielen Dank an Euch
-
Die Grösse des Buffers hängt von der Anwendung ab. Ich nehme meistens einen Buffer mit Grösse 4096 oder 8192. Probiers mal aus.
wie sollte die Variable 'buf' angelegt werden?
Das wichtigste ist wohl, dass 'buf' lange genug lebt. Wenn Du also recv(..) mit Blocking Sockets verwendest (recv(..) blockiert bis etwas empfangen wurde) kannst (sollst) Du den Buffer auf dem Stack anlegen (char buf[4096];). Falls Du dynamische Buffergrössen hast würde ich Dir std::vector<char> empfehlen (mit &v[0] kriegst Du die Adresse des ersten Elements!).
Das FAR kannst Du einfach ignorieren (AFAIK ein Überbleibsel aus alten Zeiten).
-
Vielen Dank theta
das hilft mir weiter.Auf der eine Seite muss meine Anwendung wohl den SpeicherBereich reservieren,
auf der anderen Seite wird der buf doch durch die API-Function gefüllt - und somit - dachte ich- wird diese API-Funktion 'intern' auch irgendwie eine "Begrenzung" haben müssen -> damit nicht der 'Sendende' unbegrenzte Datenmengen übergibt ??
Oder wo ist hier mein Denkfehler? bzw. wie läuft das genau ab?
Vielen Dank für Deine Bemühungen.
.
-
Du musst doch in len die Größe Deines Buffers übergeben, damit der eben nicht überlaufen kann.
-
Hi Belli, Danke auch an Dich.
Dass ich mit sizeof(buf) reservieren muss habe ich soweit verstanden,
nur dachte ich:auf der anderen Seite wird der buf doch durch die API-Function gefüllt - und somit - dachte ich- wird diese API-Funktion 'intern' auch irgendwie eine "Begrenzung" haben müssen -> damit nicht der 'Sendende' unbegrenzte Datenmengen übergibt ??
ich wollte verstehen wie die API-Funktion 'abstrakt' gesehen intern dieses regelt. - Oder wird es gar nicht von der API intern geregelt:
Also der Sendende gibt seine Speichergröße an und ich gebe meine Speichergröße an -> und der API ist es grundsätzlich egal wie groß diese beiden Speichergrößen sind?Danke für eure Bemühungen
.
-
Du reservierst Deinen Buffer mit einer angemessenen Größe - das hängt unter anderem auch davon ab, wieviel Daten Du überhaupt erwartest.
zB: char buf[1024];
Dann rufst Du recv auf, übergibst die Adresse Deines Buffers und in len 1024. Damit ist sichergestellt, dass recv auf keinen Fall mehr als 1024 Bytes liest, denn die würden ja nicht in Deinen Buffer passen.
Es spielt keine Rolle, wieviel Daten der Sender abgeschickt hat, recv liest jetzt bis zu 1024 Bytes und gibt als Funktionswert die Anzahl der tatsächlich gelesenen Bytes zurück.
-
Vielen Dank an Euch,
Ihr habt mir sehr geholfen

.