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

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

4.3 <strong>Sockets</strong> 215<br />

17–18<br />

19–22<br />

Neu ist im Vergleich zu Beispiel 4.1 die Funktion print_sockaddr(), die die<br />

übergebene Socket-Adresse in die Präsentationsdarstellung umwandelt <strong>und</strong><br />

ausgibt. Die Funktion erwartet dazu einen Zeiger auf die protokollunabhängige<br />

Datenstruktur sockaddr_storage. Diese Datenstruktur ist groß genug, um<br />

sowohl eine IPv4- als auch eine IPv6-Adresse zu beherbergen.<br />

Für die weitere Arbeit werden von der Funktion zunächst vier lokale Hilfsvariablen<br />

vereinbart. Die beiden Zeiger sa4 <strong>und</strong> sa6 werden so vereinbart,<br />

daß sie die selbe Socket-Adreßstruktur referenzieren – nämlich die übergebene<br />

Socket-Adresse – <strong>und</strong> sich nur in ihrem Datentyp unterscheiden. Je nach<br />

Adreßfamilie der übergebenen Socket-Adresse werten wir die Datenstruktur<br />

dann über sa4 oder sa6 aus. In port speichern wir die Portnummer des<br />

<strong>Sockets</strong> <strong>und</strong> in ip_address hinterlegen wir die IP-Adresse in Textdarstellung.<br />

1 #include <br />

2 #include <br />

3 #include <br />

4 #include <br />

5 #include <br />

6 #include <br />

7 #include <br />

8 #include <br />

9 #include <br />

Beispiel 4.9. quiz4.c<br />

10<br />

11 void signal_handler( int sig )<br />

12 {<br />

13 printf( "Ihre Bedenkzeit ist abgelaufen.\n" );<br />

14 exit( EXIT_FAILURE );<br />

15 }<br />

16<br />

17 void print_sockaddr( struct sockaddr_storage *sa )<br />

18 {<br />

19 struct sockaddr_in *sa4 = (struct sockaddr_in *)sa;<br />

20 struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)sa;<br />

21 int port;<br />

22 char ip_address[INET6_ADDRSTRLEN];<br />

23<br />

24 if( sa->ss_family == AF_INET )<br />

25 {<br />

26 inet_ntop( AF_INET , (struct sockaddr *)&sa4->sin_addr ,<br />

27 ip_address , INET6_ADDRSTRLEN );<br />

28 port = ntohs( sa4->sin_port );<br />

29 }<br />

30 else<br />

31 {<br />

32 inet_ntop( AF_INET6 , (struct sockaddr *)&sa6->sin6_addr ,

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!