netzwerkfähige printf-Funktion?
-
Hey CStoll,
ich verstehe das prinzip deiner lösung und sie erscheint sehr effektiv, aber:
dieses senden des strings zum clienten hab ich in einer funktion ausgelagert
int sendClient(char *command);
Problem ist, dass ich neben dem string (command) auch die einzelnen variablen an die funktion sendClient übergeben müsste. Ein workaround wäre es, deine lösung mit sprintf VOR dem aufruf von sendClient zu benutzen und das aus sprintf resultierende char array als argument an sendClient übergeben. Aber ich würd halt auch diese aufgabe in die funktion sendClient kapseln.
Ist vielleicht etwas schlecht erklärt. Aber frag/fragt ruhig nach.
Danke,
DipSet
-
Auch dafür gibt es eine Lösung: man: vsprintf (übernimmt anstelle der Ellipse eine va_list)
-
Hey cstoll,
danke für deine antwort.
Doch kannst du mir evtl ein beispiel zeigen, wie man einen string mit sagen wir 2 variablen mit der funktion an eine 2. funktion übergeben kann?
danke
-
Auf der verlinkten Manual-Seite ist auch ein Beispiel, wie du vsprintf() verwenden kannst - der zugehörige Aufruf sieht ganz "normal" aus.
-
spricht irgendetwas dagegen mittels fdopen aus dem socket-descritor eine file-descriptor zu machen und dann schlicht fprintf zu nutzen?
also:int socket; //wo der auch immer gesetzt wird. ... FILE* socket_des=fdopen(socket,"w"); //stdio-file-descriptor erzeugen. hier nur zum schreiben. fprintf(socket_des,"spaß"); //und daten schreiben
das läuft auf allen posix-kompatiblen systemen. bei windows bin ich mir aber nicht sicher. sollte aber auch gehen.
-
Oh whow, hört sich gut an. Ich übersetz mal für mich c-anfänger: Du meinst also, dass ich den socket deskripter in einen file-deskriptor umwandle (wie du ja schon sagtest) und somit die funktion fprintf direkt über das netzwerk verwenden kann, und somit den string ganz gewöhnlich übergeben kann?
Funktioniert das? Kann das jemand bestätigen? Kanns momentan nicht ausprobieren.
-
umwandeln trifft es nicht ganz. eigentlich bleibt es der gleiche handler, er wird nur in einer anderen tabelle verwaltet.
du kannst damit nicht nur fprintf sondern auch fscanf benutzen, wenn du lust hast. allerdings solltest du dir wohl besser einen zweiten handle fürs lesen erzeugen. sieht eleganter aus.
wichtiger hinweis: mische niemals die zugriffe auf den stream- und den file-descriptor. wenn du eine file-descriptor hast, nutze den auch und mach keinen direkten zugriff auf den stream also keinen zugriffe per write(socket, buf, size) mehr, wenn du fdopen ausgeführt hast. erst wieder ein fclose, dann kann es weiter gehen. du musst deine file-descriptoren auch schließen bevor du den socket zumachst. das kann sonst zu sehr lustigem verhalten führen.achja, nebenbei: stdin, stdout und stderr sind auch nur file-descriptoren von streams.
-
Ok großartig. Also ich werde beachten, dass wenn ich einen file-descriptor offen habe, ich nur auf diesem operiere und ihne rst schließe, bevor ich au dem socket descriptor operiere. Ich werd es später austesten. Hab momentan leider keine zeit. Werde mich heut abend melden.
Bei der lösung kann ich dann aber den sendevorgang des strings + der variablen zum clienten leider nicht in einer eigenen funktion entkoppeln. Müsste dann bei jedem string, der gesendet werden soll das schreiben, was du bereits erwähnt hast, ghorst:
FILE* socket_des = fdopen(sockfd,"w"); fprintf(socket_des,"Sockfd ist %d\n", sockfd);
Ich schätze, um es in einer eigenen funktion zu entkoppeln, muss ich vsprintf benutzen, um eine variable, jedoch endliche menge an variablen mit zu übergeben.
Danke nochmal an alle
-
dipset schrieb:
Ich schätze, um es in einer eigenen funktion zu entkoppeln, muss ich vsprintf benutzen, um eine variable, jedoch endliche menge an variablen mit zu übergeben.
Nein, mußt du nicht - es gibt auch vfprintf() (und sogar vprintf() - nur der Vollständigkeit halber).
-
@dipset das fdopen musst du nur einmal ausführen. mach es so wie du es sonst mit deinem socket-handler machst, speicher den descriptor irgendwo zentral und nutze ihn dann bei jedem funktionsaufruf von fprintf/fscanf.
oder was eleganter ist, kapsele die aufrufe und nutze die von cstoll erwähnt funktion vfprintf.