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> 211<br />

Wir modifizieren unseren UDP-Client für das Time-Protokoll nun so, daß<br />

er über einen verb<strong>und</strong>enen UDP-Socket <strong>mit</strong> dem Server kommuniziert. Beispiel<br />

4.8 zeigt die relevante Passage der angepaßten Version:<br />

Beispiel 4.8. timeclientudpconn.c<br />

40 /* UDP-Socket "verbinden" */<br />

41 if( connect( sd, (struct sockaddr *)&sa,<br />

42 sizeof( sa ) ) < 0 )<br />

43 {<br />

44 printf( "connect() failed: %s\n", strerror( errno ) );<br />

45 close( sd );<br />

46 exit( EXIT_FAILURE );<br />

47 }<br />

48<br />

49 /* Leeres Datagramm als Anforderung an Server schicken */<br />

50 if( sendto( sd, NULL, 0, 0, NULL, 0 ) < 0 )<br />

51 {<br />

52 printf( "sendto() failed: %s\n", strerror( errno ) );<br />

53 close( sd );<br />

54 exit( EXIT_FAILURE );<br />

55 }<br />

56 printf( "Anfrage an %s verschickt.\n", argv[1] );<br />

57<br />

58 /* Ausgabe des Servers lesen */<br />

59 if( recvfrom( sd, &stime , sizeof( stime ), 0, NULL,<br />

60 NULL ) < 0 )<br />

61 {<br />

62 printf( "recvfrom() failed: %s\n", strerror( errno ) );<br />

63 close( sd );<br />

64 exit( EXIT_FAILURE );<br />

65 }<br />

66 printf( "Antwort von %s erhalten.\n", argv[1] );<br />

Ein Testlauf zeigt sofort das geänderte Verhalten des Programms. Sofern der<br />

Zeitdienst auf dem adressierten Rechnersystem inaktiv ist, beendet sich das<br />

Testprogramm <strong>mit</strong> einer Fehlermeldung:<br />

$ ./timeclientudp 192.168.1.1<br />

Anfrage an 192.168.1.1 verschickt.<br />

recvfrom() failed: Connection refused<br />

Interessant ist, daß nicht die sendto()-Funktion den Fehler meldet, sondern<br />

daß erst recvfrom() <strong>mit</strong> einem Fehlercode zurückkehrt. Dies zeigt, daß der<br />

Versand der Daten aus Sicht des lokalen Systems zunächst nach wie vor in<br />

Ordnung ist, daß also die UDP-Schicht das entsprechende UDP-Datagramm

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!