fgets / fputs ueber einen socket

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

fgets / fputs ueber einen socket
hi,

wie realisiert man obiges am besten?
zum beispiel soll man beim remote-ls-daemon den namen des verzeichnisses ueber den socket einlesen, also mit fgets, denke ich. das erwartet aber einen stream - soll man den filedescriptor per fdopen in einen stream umwandeln oder gibt es da eine einfachere moeglichkeit?
selbiges gilt fuer fputs, das man in der aufgabe auch braucht, um den inhalt zurueckzuschreiben.

oder soll man die raw read / write funktionen benutzen?


wie du willst :slight_smile: wenn du stdio benutzen willst musst du natürlich den filedes in einen stream umwandeln (fdopen). Oder wie in rshd stdio umleitung


hmm,
aber irgendwas funktioniert da mit read () noch nicht so, wie ich es will:

if (read (insocket, buffer, MAX) == -1) {
                                perror ("read ()");
                                exit (EXIT_FAILURE);
}
printf ("buffer: x%sx\n", buffer);
buffer [strlen (buffer) - 1] = '\0';
printf ("buffer later: x%sx\n", buffer);

produziert z. b. bei “/tmp” mit implizitem ‘\n’ am ende:

buffer: x/tmp
x
xuffer later: x/tmp

muss man das verstehen, oder hab ich mich verzaehlt?


kuckmal in den setstdio thread evtl is das das gleiche problem und hängt gar nicht mit telnet sondern mit den sockets zusammen… weiss aber auch nicht weiter warum das passiert. Oder Du verwendest ja wahrscheinlich telnet um in den socket von der andern seite zu schreiben :wink:


danke,
bin wirklich ein idiot. hatte die entsprechenden beitraege im anderen thread nur ueberflogen. was trotzdem noch komisch ist: wenn ich entsprechend strlen (buffer) - 2 hinschreibe, dann geht es z. b. mit “/tmp” und “/home” aber nicht mit “/” oder “/home/steppenwolf”, da haengt immer noch ein newline oder so hinten dran. wie kann das sein?
und was ist der unterschied zwischen carriage return, newline und line feed?


also soweit ich weiss (und da bin ich mir jez keineswegs sicher) ist unter DOS ein Newline eine Sequenz von Carriage Return und Linefeed, also 13,10 unter Unix aber einfach nur der Linefeed 10.

das problem kann ich hier nicht nachvollziehen bei mir erzeugen die folgende ausgaben

Len 6 (/tmp)
47, 116, 109, 112, 13, 10, 0, 
-10-
Len 3 (/)
47, 13, 10, 0, 
-10-
Len 19 (/home/steppenwolf)                         
47, 104, 111, 109, 101, 47, 115, 116, 101, 112, 112, 101, 110, 119, 111, 108, 102, 13, 10, 0, 
-10-        

also wie man sieht jeweils 13,10,0 am ende


also,
falls es jemanden interessiert:

ich habe jetzt netcat benutzt (thx @yves), da kann man dann einfach ctrl+d zum terminieren von fgets benutzen und braucht kein newline mehr zum wegcutten. das problem ist dadurch trotzdem nicht behoben, erst ein regelmaessiges

memset (&buffer, 0, MAX);

erzwingt das gewuenschte verhalten. warum das so ist, verstehe ich nicht, weil fgets ja immer einen durch ‘\0’ terminierten string in den buffer eintragen sollte, es offensichtlich aber nicht immer tut…


fgets tut das schon
read aber nicht, und deshalb kommt bei obigem code (xuffer) wurst raus, weil strlen ohne \0 net richtig arbeiten kann…
oder laber ich grad selber mist?


ah, super!
vielen dank, wieder eine erleuchtung mehr fuer heute.