Aufgabe 8


Naja,du bist wohl einzige der noch an der aufgabe haengt… :cool:

(zusammen mit mir :red: )


Wenn ich noch an der Aufgabe haengen wuerde, haette ich ja kaum Zeit hier zu posten :slight_smile:


CE’ler…zero points… :cool:
Comrade…twelve points…


Mal ne Frage zu Teilaufgabe a),also zur Verwendung der gegebenen forward.o.

Wenn ich die da benutz,muss die evtl. in eine Schleife?
Also wenn ich jetz das Ganze mit meinem Browser teste,dann kann ich eben genau einmal was laden und dann kommt vom Browser eine “connection refused” meldung…und das port_forward beendet sich.

Laut der forward.h kehrt die Funktion zurueck wenn einer der beiden Filedescriptoren geschlossen wurde…ist das denn der Fall ,nach einem Ladevorgang?


Der Browser bzw. Server machen je nach Einstellungen die Verbindung dicht sobald eine Datei uebertragen wurde. Fuer jede Datei wird dann eine neue Verbindung aufgebaut. Wenn Du Teilaufgabe c programmiert hast sollte das Problem also nicht mehr auftreten, bis dahin ist es noch ok.


Ja. Musst dir nur den Vorgang klar machen. Wenn du eine Seite aufrufst, machst du einen Request an dein lokal laufenden port_forward, der sich daraufhin verbindet und so lange Daten hin und her schickt, wie welche kommen. Sobald die Seite fertig geladen ist , wird die Verbindung geschlossen. Jeder neue Seitenaufruf ist eine neue Verbindung, die dein Browser macht, und eine neue Antwort, die der Webserver dir schickt. Liegt halt am http-protokoll.
[edit]
das kommt davon, wenn man so langsam tippt…
[/edit]


Danke euch beiden…hab eben heut mal bei wem das fertige programm gesehn und das hat mich dann halt verunsichert…

(okay ,okay,twelve points fuer den chris und Null fuer mich :cool: )…


Warum muss man bei gethostbyname() eigentlich memset() und memcpy() verwenden?!


reicht es nicht so?

if((host=gethostbyname(“…”))==NULL){ herror(“gethostbyname”); exit(EXIT_FAILURE);}

sin.sin_famiy=AF_INET;
sin.sin_port=htons(PORT);
sin.sin_addr=(struct in_addr)host->h_addr;

if(connect(fd, (struct sockaddr*)sin, sizeof(sin))) …u.s.w


Ich schaetze mal, das memset 0 wird gemacht, wenn man eine lokale Variable hat (die ja auf den Stack kommt) und man nicht alle Member der Struktur setzen wird, sonst koennten u.U. die nicht explizit beschriebene Member unsinnige Werte enthalten.


denke ich auch


moin moin,

wollten mal unsere aufgabe posten - ob das soweit mit der fehlerbehandlung stimmt? es funktioniert jedenfalls :wink:

void *buffer (void *args) {
char buffer[1024];
int *argi = (int *) args;
int laenge;

    while(1) {
            laenge = read(argi[0], buffer, 1024);
            if (laenge == 0) return 0;
            write(argi[1], buffer, laenge);
    }
    return 0;

}

int forward (int in, int out) {
pthread_t first, second;
int args1[2], args2[2];

    args1[0] = args2[1] = out;
    args1[1] = args2[0] = in;

    if (pthread_create(&first, NULL, buffer, (void *) args1) != 0 ||
    pthread_create(&second, NULL, buffer, (void *) args2) != 0) return -1;

    if (pthread_join(first, NULL) != 0 || pthread_join(second, NULL) != 0) return -1;
    return 0;

}

wobei wir jetzt das mit dem exit(0) nicht ganz nachvollziehen können, da er dadurch ja das kind abschiesst und anstatt wie in der forward.h nur 0 zurueckzuliefern…


Also ich habe das etwas extravagant (aber elegant) mit [m]pthread_cancel()[/m] gelöst: Sobald ein Thread merkt, dass er nicht mehr lesen oder schreiben kann, schießt er seinen “Partner-Thread” ab und beendet die Funktion ordnungsgemäß mit 0. :wink:
Ich habe mal meine verbesserten Lösungen unter dem hoffnungsvollen Titel “Musterlösungen” hier ins Netz gestellt: http://airhardt.de.vu/sos1