Hallo,
char buf[512] = {0};
char* r = NULL;
FILE* fd = fdopen(socket, "r");printf("Request: \n");
while(!feof(fd)) {
r = fgets(buf, sizeof(buf), fd);
printf("%s", r);
}printf("hallo");
sieht okay aus - abgesehen davon, dass r überflüssig ist und du ebensogut buf ausgeben könntest (fgets gibt als Ergebnis den Zeiger auf den Puffer zurück, oder NULL im Fehlerfall).
> Das printf nach der Schleife wird erst ausgegeben wenn der Client die Verbindung beendet.
Ja, selbstverständlich. Erst wenn der sendende Teilnehmer die Verbindung beendet, kann der empfangende Teilnehmer auf Socket-Ebene erkennen, dass das Ende der Daten bzw. das Ende der Übertragung erreicht ist (oder eben durch ein Timeout).
> Aber es sollte ausgegeben werden wenn die Anfrage zuende ist ...
Woran würde man das erkennen, wie würde man dieses Ende definieren? Falls die Information über das Ende in den Nutzdaten steckt, müsstest du das auch auf der Ebene abfrühstücken. Das heißt, du musst beim Empfang schon die Daten analysieren und auf "logischer Ebene" eine Endekennung realisieren.
Auf Socket-Ebene ist das Abbauen der Verbindung das einzige Merkmal, an dem der horchende Teilnehmer das Ende der Übertragung erkennen kann, so dass feof() überhaupt anspricht. Anders gesagt: foef() kann aufgrund seiner Implementierung nur verbindungsorientiert das Ende anzeigen. Solange die Verbindung bestehen bleibt, ist feof() machtlos und das falsche Werkzeug - der sendende Teilnehmer könnte ja jederzeit nochmal Daten nachlegen.
> und ich bin immer noch der Meinung das die Dateiendekennung fehlt.
Wie würde die deiner Meinung nach aussehen?
So long,
Martin
--
Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde.