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.

178 4 Gr<strong>und</strong>lagen der Socket-Programmierung<br />

12–14<br />

16–18<br />

beiden Bytewerte 00 <strong>und</strong> 01 der 16-Bit Ganzzahl einfach ablesen können. Die<br />

Speicherung der Zahl 1 erfolgt selbstverständlich in der für das System typischen<br />

Byteanordnung (Host Byte Order), je nach Rechnersystem also im<br />

Little-Endian- oder Big-Endian-Format. Die Ausgabe zeigt nochmals den 16-<br />

Bit Hexadezimalwert von host_val.<br />

Jetzt wandeln wir die in host_val gespeicherte, rechnerspezifische Darstellung<br />

der Zahl 1 in die Network Byte Order, also ins Big-Endian-Format um <strong>und</strong><br />

weisen das Ergebnis der Variablen net_val zu. Im Anschluß geben wir zur<br />

Kontrolle den 16-Bit Hexadezimalwert von net_val aus.<br />

Falls es sich bei unserem Rechnersystem um ein Big-Endian-System handelt,<br />

bleibt die Darstellung unverändert. Der in host_val gespeicherte Wert liegt<br />

bereits im Big-Endian-Format <strong>und</strong> da<strong>mit</strong> in der Netzwerkdarstellung vor. Die<br />

Funktion htons() hat demnach keine Arbeit zu verrichten.<br />

Auf einem Little-Endian-System muß htons() dagegen die beiden Bytes der<br />

16-Bit Ganzzahl vertauschen, um die Darstellung von der Host Byte Order in<br />

die Netzwerkdarstellung zu übertragen. In diesem Fall unterscheiden sich also<br />

die Werte von host_val <strong>und</strong> net_val, was wir nachfolgend ausnutzen.<br />

Die abschließende printf()-Ausgabe bringt die gesammelten Erkenntnisse<br />

auf den Punkt: Unterscheidet sich die Darstellung in Host Byte Order von der<br />

Darstellung in Network Byte Order, dann läuft das Programm offensichtlich<br />

auf einem Little-Endian-System. Sind die beiden Darstellungen identisch, so<br />

erkennt das Programm ein Big-Endian-System.<br />

Ein abschließender Test soll uns Aufschluß über die Architektur zweier Rechnersysteme<br />

geben. Zunächst ein Testlauf auf einem Intel-kompatiblen Rechner<br />

<strong>mit</strong> Linux-Betriebssystem:<br />

$ ./byteorder<br />

Host Byte Order: host_val = 0001<br />

Network Byte Order: net_val = 0100<br />

Ich bin ein Little-Endian-System.<br />

Anschließend der gleiche Test auf einem IBM RS/6000-System <strong>mit</strong> Power3-<br />

Prozessor <strong>und</strong> AIX-Betriebssystem:<br />

$ ./byteorder<br />

Host Byte Order: host_val = 0001<br />

Network Byte Order: net_val = 0001<br />

Ich bin ein Big-Endian-System.<br />

Die beiden Testsysteme unterscheiden sich also in Ihrer Art, Multibyte-Werte<br />

im Hauptspeicher anzuordnen. Während es sich bei der Kombination aus<br />

IBM RS/6000 <strong>mit</strong> AIX um ein Big-Endian-System handelt, werden die Daten<br />

auf einem Intel-kompatiblen PC <strong>mit</strong> Linux im Little-Endian-Format abgelegt.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!