aufgabe 7

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.

aufgabe 7
kann mir einer mal verständlich beibringen was diese select-funktion eigentlich genau macht? Sowohl die Übungsfolien als auch die manpage (die bei mir übrigens unter b[/b] und nicht unter b[/b] steht - was auch immer 3C bedeuten soll…) überschütten einen nicht gerade mit Infos… :-/


Soweit ich die Funktion verstanden hab, kannst du ihr ein paar Sockets oder File Descriptors mitgeben und sie kann die alle kontinuierlich auf Änderung ihres Zustands prüfen. Wenn select() zurückkommt, sollte in den Arrays wohl sowas wie eine Liste von Sockets/FDs stehen, die neue Daten haben oder so in der Art, das lässt die manpage und die Folie leider recht unklar.

Mir war die Funktion dann zu blöd und ich hab’s einfach selber gemacht. Du brauchst in dem Fall ja nur eine Schleife, in der du was von den Sockets liest. Nur soll er nicht blockieren, das geht mit einem der recv()-Flags, siehe manpage. Und das immer abwechselnd in ner Schleife - fertig. Funktioniert wunderbar.


int select(int n, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);

n: Filedeskriptoren sind ja ints. n ist tatsaechlich der groesste dieser ints+1
also einfach die Zahlenwerte vergleichen den groesseren nehmen und 1 drauf addieren

Die fd_set mit den entsprechenden Makros bearbeiten.

readfds: Zeiger auf ein set in dem alle FDs stehen, die darauf ueberprueft werden sollen ob du von ihnen lesen kannst, ohne dass read blockiert

writefds: wie readfds, nur fuer schreiben

exceptfds: fuer exceptions, braucht ihr nicht

timeout: damit koennt ihr festlegen wie lange select blockiert. Wenn ihr NULL angebt blockiert es bis was passiert ist, das koennt ihr verwenden.

nach dem select stehen in readfds dann nur noch FDs von denen man lesen kann und in writefds nur noch FDs auf die man schreiben kann. Das muesst ihr dann nur mit den Makros pruefen und entsprechend eben vom einen lesen und in den andern schreiben.


auf die gefahr hin mit unwissen zu spucken:

ist das normal, dass der xxxproxy.inf… zum testen von meinem rechner daheim net funzt???

ich hab das po_fo über putty von daheim gemacht und auf dem unirechner gestartet, aber es tut sich nix wenn ich daheim als proxy
den unirechner mit meiner portnummer angeb.

is des falsch oda kann ich mit sicherheit sagen dass mein prog falsch is???


ha!
noch ne frage:

kann ein port kann doch nicht für mehrere verbindungen gleichzeitig benutzt werden?!
weil warum soll ich dann das prog forken, wenn dann zwei identische verbindungen entstehen. der zielrechner ist ja immer der selbe. da gibts doch n fehler.

oder1: benutzen alle children den selben filedeskriptor für das ziel???
aber dann kann doch der zielrechner nurnoch schlecht unterscheiden an wen er jetzt was zurücksenden soll???

oder2: leitet jedes child an einen anderen rechner weiter und ich muss für jedes child ne abfrage machen wohin ichs denn weiterleiten soll

???


  1. Doch das geht. Schreibe diesen Post gerade auf diese Weise über einen Forwarder

  2. Auf dem Server Port 8080 wird nur eine Verbindung ausgehandelt, die tatsächliche Kommunikation findet dann ja auf einem anderen Port statt, kriegst ja von accept nen neuen socket


Also ich mag mein Programm jetzt testen, aber check irgendwie nicht so ganz wie…
Ich hab mein pf jetzt hier laufen (mit weiterleitung zum wwwproxy.blabla auf Port 8080) und im Konqueror mich selbst als Proxy eingetragen.
Wenn ich jetzt versuch eine Seite aufzurufen sagt mir mein tolles pf, dass 419 Bytes von mir kamen und weitergeleitet wurden, und dass daraufhin 1173 Bytes zurückgekommen sind (und auch weitergeleitet wurden…)

Im Konqueror bekomme ich dann diese Meldung:

Aber da steht ja immerhin schonmal was vom wwwproxy, also so richtig falsch bin ich schonmal nicht :smiley:

Kann mir mal einer erklären, was da los ist, und wo ich den Fehler am besten suche?


Der Proxy laesst nur Verbindungen von innerhalb des Uninetzes zu, d.h. der PC, auf dem der portforward laeufft muss auch in der Uni, also genauer im cip halt stehen.
Die Tatsache, dass du schon die somit korrekte Fehlermeldung vom proxy bekommst, ist doch schonmal net schlecht. Versuch einfach mal das Programm in der Uni auszufuehren.


Excellent… :cool:

Danke!


ich versteh noch nicht so ganz, wofuer man das braucht, dass man mehrere connections entgegennehmen lassen soll.
koennte jemand vielleicht ein kleines szenario beschreiben, bei dem man das braucht und wo dann welcher socket rumgammelt?


@Steppenwolf:
Da wäre als Beispiel ein Webserver. Wenn der nur mit port 80 laufen würden, dann wäre nach einem Benutzer schluss. Um 1000 Leute gleichzeitig zu bedienen bräuchte mal also 1000 (virtuelle-) Rechner mit einer eigenen IP Adresse die jedesmal nur einen Benutzer auf port 80 versorgen.
Geschickter ist es dann auf port 80 Anfragen entgegenzunehmen und dann einen neuen port auszuhandeln auf dem dann kommuniziert wird. Aber irgendwohin müssen ja die Anfragen gestellt werden und darum bedarf es einen festen Port.
Das Programm forkt dann und hat für jeden Benutzer einen eigenen Prozess.

Der Child Prozess erbt alle offenen Verbindungen (die von port 80 aus dem Beispiel wurde ja an eine höhere Nummer weitergeleitet) und der Elternprozess resetet sich und lauscht wieder an port 80. Der Mechanismus ist also:
-an festem port hören
-bei connect neuen port aushandeln
-mit dem neuen port forken und das kind die verbindung aufrecht erhalten lassen
-elternprozess wieder an festem port lauschen lassen


das klingt für mich alles n bisschen nach cryptosuaheli! :#:

sollte doch lieber taxifahren :-/ :-/


tag

ich hab mich auch mal an die aufgabe gemacht, und funkt schon ganz gut , bis auf grössere bilder etc die läd er einfach nicht (auch wenn ich die forward funktion nehm die gegeben ist…) hatte jemand das gleiche problem und kann mir hier weiterhelfen?

achso und ist es normal das ich beim laden einer homepage öfters von server disconnected werde? und immer mal wieder connecten muss ?

danke

Drager


Kann mir jemand erklären warum mein Browser die Daten die er von dem port_forward Programm bekommt immer speichern möchte und sie nicht alls normale Website öffnet?

"Die Datei "" ist vom Typ application/octet-strem und Mozilla weiß nicht, wie dieser Typ behandelt werden soll... "

@Mäxle:

hatte das gleiche Problem mit mozilla.
Bei mir lag’s dadran, dass ich in in der forward.c mit “write” den ganzen buffer in den jw. socket geschrieben hab, man darf aber nur soviele Zeichen reinschreiben, wie man auch wirklich eingelesen hat.


Ich habe hier auch ein kleines Problem:

ich habe meine “struct hostent *host;”.
In diesen host schreibe ich mit “host = gethostbyname(argv[2]);” die Daten des Hosts. Jetzt möchte ich gerne die Netzwerkadresse ausgegeben haben und mache das mit:

printft(Hostadresse: %s, host->host->h_addr_list[0]);

Allerdings kommt da nur Schmarrn raus. Im letzten Falle 1/4m. Weiß jemand Rat?


beim mir steht da auch immer schmarrn, aber wenn ich das mit memset und memcpy (wie auf den übungsfolien) in mein sockaddr_in kopiere dann gibts damit keine probleme … und die addresse muss man ja nicht ausgeben …

ach ja zu select… “Auch der Autor hat in einem Beispiel für dieses Buch zwei Stunden für die Fehlersuche vergeudet, wo select eingesetzt wird und vergessen wurde, beim ersten argument eine 1 hinzu zu addieren” - W. Richard Stevensen - Programmieren von UNIX-Netzwerken
:smiley:


Ich habe auch eine Frage!

Wie schauts denn in der forward.c mit der Fehlerbehandlung aus?
Muss das genauso sein wie die vorgegebene forward.o (bei Fehler -1 als rückgabewert, ansonsten, also wenn ein fd geschlossen wird, 0) verhalten?

Wenn ja, muss ich das wieder mit nem Signalhandler machen, der SIGPIPE ignoriert und auf -1 vom write warten? Wie mach ich das dann bei read? Was ist wenn einfach ewig nichts passiert? Mikey meinte ja timeout brauchen wir nicht,

Danke schonmal !


ich hab leider keine antwort sondern nur eine frage :-/

nachdem ich mir mein eigenes forward.c geschrieben hab funzts nicht mehr… also es wird nur noch eine verbindung entgegen genommen und dann hängt der port_forward und macht gar nix mehr. hab auch schon der select funktion ein timelimit gesetzt aber das bringt nichts. woran kann das liegen???