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.

248 5 Netzwerkprogrammierung in der Praxis<br />

35–45<br />

47–49<br />

51–53<br />

55<br />

Anschließend werden <strong>mit</strong> der readcbuf()-Funktion in einer Schleife maximal<br />

nbyte-1 Zeichen vom Dateideskriptor gelesen <strong>und</strong> im Datenpuffer des Aufrufers<br />

abgelegt. Die readcbuf()-Funktion liefert dabei pro Aufruf jeweils ein<br />

Zeichen zurück, welches anschließend inspiziert wird. Sofern dabei das Dateiende<br />

3 erreicht oder im Datenstrom ein Zeilenumbruch erkannt wird, wird die<br />

Schleife umgehend verlassen.<br />

Danach überprüft readline(), ob vor einem eventuell erkannten Ende des<br />

Datenstroms überhaupt noch Zeichen vom Dateideskriptor gelesen wurden.<br />

Falls dies nicht der Fall ist, falls also un<strong>mit</strong>telbar das Dateiende erkannt wurde,<br />

gibt die Funktion auch das EOF bzw. den Wert 0 zurück. Die leere Zeichenkette<br />

wird in diesem Fall auch nicht <strong>mit</strong> einem Nullzeichen terminiert.<br />

Andernfalls wird an die Zeichenkette noch ein Nullzeichen angehängt <strong>und</strong><br />

die Länge der Zeichenkette (inklusive Nullzeichen) wird schließlich an den<br />

Aufrufer zurückgegeben.<br />

Als nächstes werfen wir einen Blick auf Beispiel 5.5, welches die von der<br />

readline()-Funktion verwendete Hilfsfunktion readcbuf() zeigt:<br />

Die readcbuf()-Funktion legt jeweils ein Zeichen aus dem Dateideskriptor<br />

fildes an dem durch buf referenzierten Speicherort ab. Zur Steigerung der<br />

Effizienz liest die Funktion intern allerdings bei Bedarf immer gleich einen<br />

ganzen Datenblock ein <strong>und</strong> legt diesen in einem Zwischenpuffer ab. Der Zwischenpuffer<br />

sowie sein aktueller Füll- <strong>und</strong> Verarbeitungsstand wird über den<br />

Parameter rl referenziert. Im Normalfall liefert readcbuf() die Anzahl der<br />

zurückgegeben Zeichen (also 1) als Rückgabewert. Im Fehlerfall retourniert<br />

die Funktion der Wert -1. Alternativ zeigt der Rückgabewert 0 das Dateiende<br />

bzw. das Ende der Socketverbindung an.<br />

Beispiel 5.5. readwrite.c, Teil 2<br />

55 ssize_t readcbuf( int fildes , char *buf, readline_t *rl )<br />

56 {<br />

57 while( rl->count < 1 )<br />

58 {<br />

59 if( ( rl->count = read( fildes , rl->buf,<br />

60 sizeof( rl->buf ) ) ) < 0 )<br />

61 {<br />

62 if( errno == EINTR ) /* Unterbrechung */<br />

63 rl->count = 0;<br />

64 else<br />

65 return( -1 ); /* Fehler */<br />

66 }<br />

67 else if( rl->count == 0 ) /* EOF */<br />

68 return( 0 );<br />

3 Das Dateiende bzw. EOF bedeutet in diesem Fall, daß die Gegenstelle den Socket<br />

geschlossen <strong>und</strong> da<strong>mit</strong> den Abbau der TCP-Verbindung eingeleitet hat.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!