Not logged in. · Lost password · Register

Page:  previous  1  2  3  next 
Guardian
Avatar
Member since Oct 2002
797 posts
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?
Der Anführer eines großen Heeres kann besiegt werden. Aber den festen
Entschluß eines einzigen kannst Du nicht wankend machen.
snehls
Superfreund aka Der Schwede
Avatar
Member since Oct 2002
750 posts
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
 :-D
"I will speculate that today’s single-threaded applications as actually used in the field could actually see a performance boost for most users by going to a dual-core chip, not because the extra core is actually doing anything useful, but because it is running the adware and spyware that infest many users’ systems and are otherwise slowing down the single CPU that user has today."
Str1ch444
Member since Jun 2003
312 posts
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 !
snehls
Superfreund aka Der Schwede
Avatar
Member since Oct 2002
750 posts
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???
"I will speculate that today’s single-threaded applications as actually used in the field could actually see a performance boost for most users by going to a dual-core chip, not because the extra core is actually doing anything useful, but because it is running the adware and spyware that infest many users’ systems and are otherwise slowing down the single CPU that user has today."
Str1ch444
Member since Jun 2003
312 posts
Hast du auch geschaut ob du in beide Richtungen lesen und schreiben kannst?
Ich hatte das auch vergessen und beim Browser blieb dann immer nur eine leere Seite.
snehls
Superfreund aka Der Schwede
Avatar
Member since Oct 2002
750 posts
Quote by Str1ch444:
Hast du auch geschaut ob du in beide Richtungen lesen und schreiben kannst?
Ich hatte das auch vergessen und beim Browser blieb dann immer nur eine leere Seite.

naja wenn ich in die eine richtung lesen kann und in die andere schreiben (was ich halt prüfe), dann les ich aus der einen und schreib auf die andere mit read und write.

in eine richtung gleichzeitig lesen und schreiben geht doch nicht, oder?

achja wenn ich lese muss ich ja in nen buffer reinlesen, wie groß solld er denn sein und welcher art ? bei mir ist das ein char-buffer.. liegt da der fehler?
"I will speculate that today’s single-threaded applications as actually used in the field could actually see a performance boost for most users by going to a dual-core chip, not because the extra core is actually doing anything useful, but because it is running the adware and spyware that infest many users’ systems and are otherwise slowing down the single CPU that user has today."
Str1ch444
Member since Jun 2003
312 posts
Quote by snehls:
in eine richtung gleichzeitig lesen und schreiben geht doch nicht, oder?


Naje, wenn du von fd1 lesen und fd2 schreiben geht, dann machste das halt. Und andersrum halt auch (Huh?)

Quote by snehls:
achja wenn ich lese muss ich ja in nen buffer reinlesen, wie groß solld er denn sein und welcher art ? bei mir ist das ein char-buffer.. liegt da der fehler?


Ich hab auch nen char buffer und bei mir funzts.
Yves
Code artist
(Administrator)
Avatar
Member since Nov 2002
3282 posts
In reply to post #18
Quote by Str1ch444:
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?
Ist das in dem Fall nicht egal? Wenn forward() beendet, machst du die Sockets zu. Ob nun ein Fehler war oder nicht, die Reaktion ist doch die gleiche.
Physikalisch gesehen ist ein Quantensprung die kleinstmögliche Zustandsänderung, meist von einem höheren auf ein niedrigeres Niveau.

Komprenu Energiemonitoring-Software | dotforward Webhosting
Yves
Code artist
(Administrator)
Avatar
Member since Nov 2002
3282 posts
In reply to post ID 11162
Quote by Erik:
(...)
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

Sicher? Also ich hab eher den Eindruck, dass eine Verbindung mit 2 Endpunkten eindeutig durch die beiden Adressen mit ihren Port-Nummern beschrieben wird. Also: Der Server hört auf einer festen IP auf Port 80. Alle eingehenden Verbindungen kommen von unterschiedlichen Adressen (Clients). Wenn ein Client 2 Verbindungen aufbaut, wird er dabei 2 verschiedene Port-Nummern seinerseits verwenden (die so ab 1300 rum...). Damit gibt's überhaupt kein Problem, dass da was nicht eindeutig wäre. netstat zeigt ja schließlich auch Verbindungen zu Port 80 (http) an, und nicht zu irgendwelchen ausgehandelten Ports.

Die mehreren Prozesse braucht's dann nur zum gleichzeitigen Behandeln mehrerer unabhängiger Verbindungen.

Solche Fragen hab ich mir damals auch gestellt, als ich mit Sockets angefangen hab und mir das alles recht undurchschaubar vorkam. Allerdings ist doch der wichtigste Prozess dabei, dass beim connect() ein freier Port auf dem lokalen System ausgewählt wird, von dem aus dann verbunden wird. So kann es überhaupt keine 'doppelten Zeilen im unique index' geben.

Ich lass mich aber gerne eines besseren belehren, wenn das jetzt totaler Quak war.
Physikalisch gesehen ist ein Quantensprung die kleinstmögliche Zustandsänderung, meist von einem höheren auf ein niedrigeres Niveau.

Komprenu Energiemonitoring-Software | dotforward Webhosting
SDN
Member since Feb 2003
18 posts
Subject: seitenaufbau endet nach bestimmter zeit
bei uns ist folgendes problem:
der seitenaufbau des browsers wird immer langsamer und endet nach kurzer zeit und die meldung
"Connection to host www.blabla is broken"
ausserdem gibt das programm aus: "accept: Bad File Descriptor" .

Und nochwas, die uni-seiten gehen ohne probleme...
Silent_Wa
Avatar
Member since Oct 2002
298 posts
In reply to post #24
Hi Yves,

Quote by Yves:
Sicher? Also ich hab eher den Eindruck, dass eine Verbindung mit 2 Endpunkten eindeutig durch die beiden Adressen mit ihren Port-Nummern beschrieben wird. Also: Der Server hört auf einer festen IP auf Port 80. Alle eingehenden Verbindungen kommen von unterschiedlichen Adressen (Clients). Wenn ein Client 2 Verbindungen aufbaut, wird er dabei 2 verschiedene Port-Nummern seinerseits verwenden (die so ab 1300 rum...). Damit gibt's überhaupt kein Problem, dass da was nicht eindeutig wäre. netstat zeigt ja schließlich auch Verbindungen zu Port 80 (http) an, und nicht zu irgendwelchen ausgehandelten Ports.
<cut>


Hmm - du setzt einen Layer zu tief an, denn natürlich kann es mehrere TCP-Verbindungen über einen IP-Port geben. IP ist das Protokoll, in das die TCP-/ oder UDP-Pakete mit ihren Sockets eingepackt werden. IP kennt nur 65535 Ports (oder eben den Port 80), ist aber nicht verbindungsorientiert. TCP ist das sehr wohl und darum gibts auch für jede TCP-Verbindung einen Socket und zwar soviele, wie Filedescriptoren nutzbar sind.

Also... du horchst an deinem IP-Port 80, ob dir einer TCP-Pakete schickt, freust dich wenn was kommt, machst nen neuen TCP-Socket (durch das accept) und unterhältst dich mit dem Teilnehmer (mittels TCP-Paketen, die in IP-Pakete verpackt und von Port zu Port geschickt werden), horchst aber währenddessen auf dem alten Socket weiter.

Wie gesagt - TCP und IP sollte man nicht verwechseln  :-D
This post was edited on 2004-01-14, 17:22 by Silent_Wa.
Yves
Code artist
(Administrator)
Avatar
Member since Nov 2002
3282 posts
Quote by Silent_Wa:
Also... du horchst an deinem IP-Port 80, ob dir einer TCP-Pakete schickt, freust dich wenn was kommt, machst nen neuen TCP-Socket (durch das accept) und unterhältst dich mit dem Teilnehmer (mittels TCP-Paketen, die in IP-Pakete verpackt und von Port zu Port geschickt werden), horchst aber währenddessen auf dem alten Socket weiter.

Schon, aber ist das neue Socket nicht auch mit Port 80 verbunden? Also 'verbunden', denn es ist ja nicht 'verbunden' ;) Mit bind() mein ich jetzt. Es sollte nachher also 2 Sockets geben, die Daten über ihren Port 80 'austauschen', nur eins der beiden wartet halt auf neue Verbindungen (listen) und bekommt sie eben auch vom OS (bind). Jedenfalls geht meine Client-Verbindung zum HTTP auch während der Verbindung auf den Port 80.

Ein fiktiver Auszug aus der TCP-Tabelle wäre dann (aus Sicht des Servers)
FD local_host local_port <-> remote_host        remote_port status
3  faui09b    80             *                  *           listen
4  faui09b    80             dialin.t-online.de 4256        connect
7  faui09b    80             faui05c            2361        connect
Physikalisch gesehen ist ein Quantensprung die kleinstmögliche Zustandsänderung, meist von einem höheren auf ein niedrigeres Niveau.

Komprenu Energiemonitoring-Software | dotforward Webhosting
swarsron
Avatar
Member since Nov 2002
178 posts
In reply to post ID 11162
Quote by Erik:
Da wäre als Beispiel ein Webserver. Wenn der nur mit port 80 laufen würden, dann wäre nach einem Benutzer schluss.

Das stimmt nicht und ein Webserver funktioniert auch nicht wie von dir beschrieben. Ein Socket wird durch vier Werte bestimmt: Src-Adresse, Src-Port, Ziel-Adresse, Ziel-Port. Der Ziel-Port und die Ziel-Adresse koennen durchaus immer gleich sein ohne sich dadurch auf eine Verbindung zu beschraenken.

Was ihr meint ist das das Kind, das die Daten an den entfernten Rechner weiterleitet, einen anderen Socket mit einem anderen Src-Port braucht
http://happytreefriends.com/watch_episodes/index.html
"Cartoon Violence: Not recommended for small children and big babies"
frahi
Avatar
Member since Nov 2002
777 posts
Wie das der TCP/IP-Stack jetzt so wirklich macht, kann euch doch eigentlich egal sein, naja sei's drum, des ist schlieslich OTRS3 Stoff.
Der kriegt halt IP Pakete, identifiziert die anhand des IP und tcp bzw. udp headers (siehe swarsrons post), bei tcp baut er sie erst noch in richtiger Reihenfolge zusammen, bzw fordert sie neu an, bei udp reicht er sie einfach an den buffer des filedescriptors weiter. Daraus kriegt ihr sie mit read raus, bzw schreibt sie mit write rein.

Jedenfalls kriegt ihr beliebig viele eingehende Verbindungen mit accept, muesst fuer jede eine eigene Verbindung mit connect aufmachen.

In dieser Verbindung muesst ihr quasi-gleichzeitig in beide Richtungen lesen und schreiben.
Warum das?
Man weiss ja nicht, wenn man einfach abwechselnd von A nach B und dann wieder von B nach A kopiert, ob das nicht beim ersten schon haengt, weil A gerade auf etwas von B wartet (waehrend ihr im read so lange wartet, bis A etwas schickt). Um nicht haengen zu bleiben gibts drei Moeglichkeiten:
- bei open kann man ein flag O_NONBLOCK angeben, fuer unsere sockets nutzt uns des reichlich wenig
- fuer jede Verbindung einen Prozess forken
- die einzig wirklich gute Lsg. dafuer ist mit Hilfe von select

Wie das geht?
Ihr lasst den select durchlaufen, dann wisst ihr wer lese- und wer schreib-fertig ist, und dann kann man dementsprechend in die eine oder die andere Richtung schreiben.
This post was edited on 2004-01-14, 19:27 by frahi.
MatthiasM
Avatar
Member since Nov 2003
459 posts
Wenn man auf die man-page von select schaut, dann wird am Ende auf eine weitere man-page verwiesen, in der ein ausführliches Beispiel steht. Es kann doch nicht verboten sein, dieses als Vorlage zu benutzen, oder ?!? (Bitte jetzt keine 0 Punkte  :rolleyes: )
Der Computer ist ein mechanischer Hohlkopf.
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Page:  previous  1  2  3  next 
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen