05.11.2013 Aufrufe

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

4.3 <strong>Sockets</strong> 217<br />

82<br />

83 alarm( 20 );<br />

84<br />

85 fgets( eingabe , sizeof( eingabe ), stdin );<br />

86<br />

87 /* Abschließende Zeilentrenner \n <strong>und</strong> \r entfernen */<br />

88 for( i = strlen( eingabe ) - 1; i >= 0 &&<br />

89 ( eingabe[i] == ’\n’ || eingabe[i] == ’\r’ ); i -- )<br />

90 eingabe[i] = ’\0’;<br />

91<br />

92 if( strcmp( eingabe , antwort ) == 0 )<br />

93 printf( "Die Antwort ist richtig. Gratulation.\n" );<br />

94 else<br />

95 printf( "Leider falsch , richtig ist %s\n", antwort );<br />

96<br />

97 exit( EXIT_SUCCESS );<br />

98 }<br />

24–35<br />

37<br />

46–67<br />

Über die Adreßfamilie läßt sich entscheiden, ob es sich bei der Socket-Adresse<br />

um eine IPv4- oder IPv6-Adresse dreht: Für IPv4 handelt es sich bei der übergebenen<br />

Datenstruktur in Wahrheit um eine sockaddr_in-Struktur, weshalb<br />

wir in diesem Zweig der Fallunterscheidung den Zeiger sa4 dereferenzieren.<br />

Ein Aufruf von inet_ntop() wandelt die darin enthaltene IPv4-Adresse in die<br />

gepunktete Dezimaldarstellung um. Auch die Portnummer muß durch einen<br />

Aufruf von ntohs() erst von der Netzwerkdarstellung in die Host Byte Order“<br />

umgewandelt werden. Im zweiten Zweig der Fallunterscheidung behan-<br />

”<br />

deln wir die IPv6 Socket-Adresse analog.<br />

Abschließend überträgt die Funktion print_sockaddr() die er<strong>mit</strong>telten Daten<br />

über die Standardausgabe an das Clientprogramm.<br />

Das Hauptprogramm wurde im Vergleich zu Beispiel 4.1 lediglich um die<br />

beiden Aufrufe von getsockname() bzw. getpeername() <strong>mit</strong> anschließender<br />

Ausgabe erweitert. Für die vereinbarte Socket-Adreßstruktur sa wurde dabei<br />

der Typ sockaddr_storage ausgewählt. So können vom Programm sowohl<br />

IPv4- als auch IPv6-Adressen verarbeitet werden. Den benötigten Socketdeskriptor<br />

extrahieren wir <strong>mit</strong>tels fileno() aus dem Datenstrom stdin. Anstelle<br />

von stdin hätten wir in diesem Beispiel natürlich auch stdout oder<br />

stderr verwenden können, da der inetd bekanntlich alle drei Datenströme<br />

<strong>mit</strong> dem selben Socket verknüpft.<br />

Ein Test des neuen Serverprogramms listet nun die Verbindungsdaten zu<br />

den Endpunkten der Netzwerkverbindung auf. Wir verbinden uns für diesen<br />

Probelauf <strong>mit</strong> 192.168.1.1, einer IP-Adresse des lokalen Rechners. Das<br />

Quizprogramm er<strong>mit</strong>telt die Adreßinformationen des eigenen <strong>und</strong> des entfernten<br />

<strong>Sockets</strong>, gibt die Socket-Adressen aus <strong>und</strong> stellt danach die Quizfrage.<br />

Während der Quizserver bzw. der inetd, wieüber /etc/inetd.conf <strong>und</strong>

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!