Illegal seek bei fdopen()

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.

Illegal seek bei fdopen()
Hallo ich habe ein Problem :slight_smile:
Also es geht darum von der Netzwerkschnittstelle zu lesen oder auf sie zu schreiben.
Ganz grob schaut ein Programm so aus:

socket
bind
listen
accept
fdopen
fprintf

Ich habe mich ewig gefragt warum kommt bei dem client durch das fprintf nichts an.
Dann habe ich versucht


socket
bind
listen
accept
write

und siehe da es funktioniert.
Jetzt habe ich in obigem Beispiel mal den error Code angeschaut.
Und zwar bekomme ich bei dem fdopen ein EPIPE (Illegal seek)
Irgendwie bin ich recht ratlos warum ich das bekomme.
Kennt jemand das Problem? Ich bekomme diese Problem immer egal wie einfach das Programm ist…

Danke schonmal.

edit:
Also ich glaube es jetzt herausgefunden zu haben.
Dieses gesetzte errno scheint bei fdopen “normal” zu sein?!
Denn fdopen gibt bei mir jetzt keinen NULL Pointer zurück, was ein Zeichen für einen Fehler wäre, errno ist aber trotzdem gesetzt auch wenn ich es vorher zurücksetze. Liegt vielleicht daran, dass man fdopen auf einen netzwerk socket macht? Hmm naja.
Das Problem, dass bei mir nichts “gesendet” wurde, liegt wohl irgendwie daran, dass ich vergessen habe fclose aufzurufen.


fdopen erzeugt einen Stream - und der ist normalerweise gepuffert.
D.h. entweder man schaltet die Pufferung aus (Funktion setbuf(…) ) oder man macht ein
fflush auf den Stream wenn tatsaechlich Daten sofort auf den Socket raugeschrieben werden sollen.
fclose macht auch ein fflush (drum kam da dann auch was).
Ansonsten ist die Puffergroesse bei so einem Stream glaub’ ich 4 oder 8k - also man
muss ganz schoen viel schreiben, bis einfach so was auftaucht.


Danke für die Antwort jetzt wird mir einiges klar. :cheesy:


Hehe, dann is’ natürlich klar. Wenn ich mich nicht irre, müssten es genau 4096 Bytes sein.


ich hab da ein Problemchen mit fdopen:

if((file=fdopen(fd, “w+”))==NULL) F(“fdopen”);
fprintf(file, “/home/lotec”);
if(fflush(file)) fprintf(stderr, “fflush!\n”);

der Code will trotzdem nicht sofort rausschreiben, obwohl ich fflush gemacht hab.

write(fd, “/home/lotec”, strlen(“/home/lotec”)+1);

hat schon auf dieser Stelle funktioniert… was mach ich denn falsch mit fdopen?