Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch für Linux, Unix und Windows
– 2., aktualisierte und erweiterte Auflage 2006
Buch: C von A bis Z

C von A bis Z
1.116 S., mit CD, Referenzkarte, 39,90 Euro
Galileo Computing
ISBN 3-89842-643-2
gp Kapitel 28 Netzwerkprogrammierung und Cross-Plattform-Entwicklung
  gp 28.1 Begriffe zur Netzwerktechnik
    gp 28.1.1 IP-Nummern
    gp 28.1.2 Portnummer
    gp 28.1.3 Host- und Domainname
    gp 28.1.4 Nameserver
    gp 28.1.5 Das IP-Protokoll
    gp 28.1.6 TCP und UDP
    gp 28.1.7 Was sind Sockets?
  gp 28.2 Headerdateien zur Socketprogrammierung
    gp 28.2.1 Linux/UNIX
    gp 28.2.2 Windows
  gp 28.3 Client-/Server-Prinzip
    gp 28.3.1 Loopback-Interface
  gp 28.4 Erstellen einer Client-Anwendung
    gp 28.4.1 socket() – Erzeugen eines Kommunikationsendpunktes
    gp 28.4.2 connect() – Client stellt Verbindung zum Server her
    gp 28.4.3 Senden und Empfangen von Daten
    gp 28.4.4 close(), closesocket()
  gp 28.5 Erstellen einer Server-Anwendung
    gp 28.5.1 bind() – Festlegen einer Adresse aus dem Namensraum
    gp 28.5.2 listen() – Warteschlange für eingehende Verbindungen einrichten
    gp 28.5.3 accept() und die Serverhauptschleife
  gp 28.6 (Cross-Plattform)TCP-Echo-Server
    gp 28.6.1 Der Client
    gp 28.6.2 Der Server
  gp 28.7 Cross-Plattform-Development
    gp 28.7.1 Abstraktion Layer
    gp 28.7.2 Headerdatei Linux/UNIX
    gp 28.7.3 Linux/UNIX-Quelldatei
    gp 28.7.4 Headerdatei MS-Windows
    gp 28.7.5 Windows-Quelldatei
    gp 28.7.6 All together – die main-Funktionen
    gp 28.7.7 Ein UDP-Beispiel
    gp 28.7.8 Mehrere Clients gleichzeitig behandeln
  gp 28.8 Weitere Anmerkungen zur Netzwerkprogrammierung
    gp 28.8.1 Das Datenformat
    gp 28.8.2 Der Puffer
    gp 28.8.3 Portabilität
    gp 28.8.4 Von IPv4 nach IPv6
    gp 28.8.5 RFC-Dokumente (Request for Comments)
    gp 28.8.6 Sicherheit

Kapitel 28 Netzwerkprogrammierung und Cross-Plattform-Entwicklung

Heute gibt es kaum noch eine Anwendung ohne eine gewisse Netzwerkfunktionalität. Wie Sie ein einfaches Client-/Server-Beispiel erstellen können und das auch noch auf den verschiedensten Plattformen, zeigt Ihnen dieses Kapitel hier.

Die Netzwerkprogrammierung gehört nicht unbedingt zu einen der einfacheren Themen in der Programmierung. Auch wenn Ihnen das Kapitel hier den Eindruck verschafft, es sei alles nicht so schwer, lassen Sie sich nicht täuschen. Sie erhalten hier lediglich einen Einblick in die Welt der Netzwerkprogrammierung. Allerdings erscheint es mir sehr wichtig, Ihnen diese Basis mitzugeben, da heutzutage kaum noch eine Anwendung ohne Netzwerkfunktionalität angeboten wird.

Sicherlich stellt sich zunächst die Frage, wie man die Netzwerkprogrammierung in einem Buch behandelt, welches sich primär um die Erstellung von portablen Programmen befasst. Prallen hier mit der Netzwerkprogrammierung unter MS-Windows und den UNIX’en (Linux) nicht zwei verschiedene Welten aufeinander? – Im Verlaufe des Kapitels werden Sie merken, dass die grundlegenden Prinzipien dieselben sind – und gar die Funktionsnamen zum Teil die gleichen. Und darum geht es auch im zweiten Teil dieses Kapitels, der Cross-Plattform-Entwicklung. Dabei werden Sie erfahren, wie Sie sinnvoll portable Headerdateien bzw. Bibliotheken erstellen können, welche auf den verschiedensten Plattformen ausführbar sind (hier MS-Windows und Linux/UNIX) – dies natürlich wiederum anhand von Beispielen der Netzwerkprogrammierung.


Hinweis   Dem Umfang angemessen handelt es sich hier nur um eine Einführung in die Netzwerkprogrammierung. Bei dem Thema wäre es sogar angemessen, sich extra Literatur dazu anzuschaffen.



Galileo Computing - Zum Seitenanfang

28.1 Begriffe zur Netzwerktechnik  downtop

Bevor ich Sie in die Netzwerkprogrammierung einführe, möchte ich Ihnen hier noch einige Begriffe der Netzwerktechnik etwas näher bringen, damit Sie anschließend bei der Programmierung nicht ins Straucheln geraten. Sollten Sie mit den Begriffen der Netzwerktechnik bereits vertraut sein, können Sie diesen Abschnitt selbstverständlich überfliegen.


Galileo Computing - Zum Seitenanfang

28.1.1 IP-Nummern  downtop

Die IP-Nummer (IP = Internet Protokoll) ist vergleichbar mit einer Telefonnummer. Unter dieser Nummer sind Sie im Internet für alle anderen Teilnehmer erreichbar. Daher ist es auch verständlich, dass diese Nummer eindeutig sein muss, so dass keine Adressen-Konflikte auftreten können.

Statische und dynamische IP-Nummer

Bei den IP-Nummern unterscheidet man (sofern man von einem Unterschied sprechen kann) zwischen einer statischen und einer dynamischen IP-Nummer. Rechner, die ständig im Internet sind, um etwa einen bestimmten Service anzubieten, benötigen meistens eine statische IP-Nummer. Man spricht von einer statischen IP-Nummer, wenn einem Rechner einmal eine Nummer zugeteilt wird, und sich diese anschließend nicht mehr ändert. Natürlich können Sie sich auch eine eigene IP-Nummer geben lassen (bspw. um einen eigenen Webserver zu betreiben). Dazu müssen Sie sich über einen Internet-Provider oder besser gleich über den Network Information Center (NIC) eine solche Nummer zuteilen lassen. Für Privatpersonen bzw. mittelständische Firmen lohnt sich dies allerdings recht selten – da eine feste IP-Nummer auch Ihren Preis hat.

Gewöhnlich, wenn Sie sich ins Internet einwählen, wird Ihnen jedes Mal eine neue dynamische IP-Adresse erteilt. Sie wählen sich praktisch ins Internet ein und Ihr Internet-Service-Provider teilt Ihnen so eine dynamische IP-Adresse zu. Neben dem geringeren Verbrauch von IP-Adressen wird auch der Admin-Aufwand erheblich verringert. Dies trifft besonders bei größeren lokalen Netzwerken zu. Hierbei muss der Admin nicht jede einzelne statische IP-Adresse ins Netzwerk integrieren, sondern meistens übernimmt eine Software die Verteilung der dynamischen IP-Adressen.

IPv4- und IPv6-Nummern

Im Augenblick setzen sich die IP-Nummern (IPv4) noch aus vier Zahlen (32 Bit) zwischen 0 und 255 zusammen. Dadurch sind mit IPv4 Adressierungen zwischen 0.0.0.0 und 255.255.255.255 möglich – was etwa 4 Milliarden Adressen wären. Allerdings nur theoretisch – da diverse Nummern, bspw. mit der Endung 0 und 255, für andere Zwecke vergeben sind. Und 4 Milliarden IP-Adressen sind in der Tat nicht viele – wenn man dies mit der hier lebenden Weltbevölkerung vergleicht. Somit musste eine andere Lösung gefunden werden – welche auch schon längst mit IPv6 gefunden wurde. In IPv6 sind die Adressen 128 Bit, anstatt der 32 Bit in IPv4, lang. Damit lassen sich natürlich erheblich mehr IP-Adressen darstellen.

IPv6 ist allerdings noch nicht eingeführt und immer noch für unbestimmte Zeit Zukunftsmusik. Hierbei wird man sich auch gleich an eine andere Schreibweise gewöhnen müssen, die einem auf den ersten Blick ein wenig komplexer erscheint. Schreibt man bspw. eine IPv6-Adresse vollständig aus, ergeben sich acht Doppelpunkte getrennt mit Hexadezimalzahlen; bspw.

2ffd:345:34b:33:432:e23:a:2

Diese Schreibweise kann noch vereinfacht werden mit der Zusammenfassung von Nullen. So kann bspw. eine Gruppe von hintereinander folgenden Nullen durch zwei Doppelpunkte (::) angegeben werden. Dies ist bspw. auch nötig bzw. der Fall, wenn die Kompatibilität zwischen den IPv4-Adressen gewahrt werden muss. Da bspw. bei einer IPv4-Adresse, konvertiert in IPv6, die ersten sechs Gruppen mit Nullen beziffert sind (bspw. IPv4: xxx.xxx.xxx.xxx konvertiert zu IPv6: 0:0:0:0:0:0:xxxx:xxxx). So kann man es sich auch hier mit der Doppelpunktregelung einfacher machen (0:0:0:0:0:0:xxxx:xxxx; Gruppe von Nullen durch :: Ersetzen ::xxxx:xxxx). Und damit man bei der Konvertierung jetzt nicht dauernd auch noch den hexadezimalen Wert der IPv4-Adresse zur IPv6-Adresse umrechnen muss (oder errechnen lässt), ist es auch erlaubt, dass die letzten beiden Ziffern dezimal (also aus den vier Zahlen wie in IPv4) angegeben werden können (also 0:0:0:0:0:0:xxx.xxx.xxx.xxx oder auch ::xxx.xxx.xxx.xxx).


Galileo Computing - Zum Seitenanfang

28.1.2 Portnummer  downtop

Bei den Internetprotokollen TCP/IP und UDP/IP sind neben den IP-Nummern, womit ein Rechner spezifiziert wird, auch noch so genannte Portnummern (16 Bit lang; 0 bis 65535) vorhanden. Mit den Portnummern wird ein bestimmter Service (Dienst) auf dem Rechner spezifiziert. Jeder Service (Dienst) hat dabei gewöhnlich eine eigene Portnummer. Die bekannteste Portnummer z.B. dürfte 80 (HTTP-Dienst) sein, über diesen Port unterhält sich gewöhnlich der Webserver mit dem Webbrowser. Entsprechend der Portnummer reagiert also auch der Rechner mit einem entsprechenden Dienst und dem damit verknüpften Protokoll.

Bei Firewalls lassen sich die Portnummern verwenden, um gewisse Nachrichten herauszufiltern. Ebenfalls lassen sich dabei bestimmte Dienste auf dem Rechner sperren, indem einfach entschieden wird, welche Ports durchgelassen werden und welche nicht. Man kann sich die Ports gerne als Türen vorstellen – lässt man andauernd die Türe offen stehen, braucht man sich nicht über ungebetene Gäste wundern.

Selbstverständlich sind die Ports auch tlw. standardisiert. Besonders die ersten 1023 Portnummern werden bspw. von IANA (Internet Assigned Numbers Authority) kontrolliert und zugewiesen. Unter Linux/UNIX können diese ersten 1023 Portnummern in der Regel meistens nur durch den Superuser verwendet werden. Hier finden sich die Portnummern vieler Standard-Anwendungen wieder. Bspw. unterhält sich FTP über Port 21, TELNET über Port 23 oder der Internetverkehr (HTTP) über Port 80. Natürlich sind die Portnummern unter 1024 auch ein beliebtes Ziel für Hacker.


Galileo Computing - Zum Seitenanfang

28.1.3 Host- und Domainname  downtop

Zwar wissen Sie jetzt, dass im Internet alles über IP-Nummern erreichbar ist, aber wenn Sie sich mit diesen Nummern durchs WWW hangeln müssten, wäre das Internet wohl heute nicht so erfolgreich. Deshalb wird an die Nummern noch zusätzlich ein Name, bestehend aus Host- und Domainname (und eventuell einer Top-Level-Domain (TLD)), vergeben (hostname.domainname.tld; bspw. www.pronix.de).

Der Domainname ist der Name, womit Sie eine Webseite (bspw. pronix.de) im Internet ansprechen. Ein Domainname wird von hinten nach vorne aufgelöst. Somit steht das de für die Top-Level-Domain (wie der Name sagt, dass was ganz vorne steht). Die Top-Level-Domain bezeichnet die Herkunft und/oder die Zugehörigkeit (.com; .gov; .net; etc.), was hier mit de – für Deutschland steht. Nach dem Top-Level-Domain folgt der eigentliche Domainname, der im Beispiel pronix lautet.

Der Hostname ist somit die niedrigste Instanz eines Domainnamens, da dieser ja von hinten nach vorne aufgelöst wird (aber der erste Teil in der Leseweise). Gewöhnlich lautet im Internet der Hostname www (www.pronix.de) – allerdings spricht nichts dagegen, diesen auch anders zu benennen. Es wird nämlich nur empfohlen, weil sich viele Anwender an das www gewöhnt haben. Genauso gut können Sie auch abc.pronix.de verwenden.


Galileo Computing - Zum Seitenanfang

28.1.4 Nameserver  downtop

Einfach ausgedrückt ist ein Nameserver ein Rechner, der für die Umsetzung von Rechnernamen zur IP-Nummer verantwortlich ist. Im Internet bspw. ist dies vergleichbar mit einem Telefonbuch, wo der Name des Teilnehmers in die Telefonnummer aufgelöst wird. Der Dienst, der Ihnen diese Arbeit im Internet abnimmt, wird als Domain Name System (DNS) bezeichnet. Bei kleineren Netzwerken wie bspw. dem Intranet, werden die lokalen IP-Nummern meistens in Form einer Tabelle in einer Datei hinterlegt.


Galileo Computing - Zum Seitenanfang

28.1.5 Das IP-Protokoll  downtop

Das IP-Protokoll ist dafür verantwortlich, dass die Datenpakete von einem Sender über mehrere Netze zum Empfänger transportiert werden. Die Übertragung des IP-Protokolls findet paketorientiert und verbindungslos statt. Es wird dabei nicht garantiert, dass die Pakete in der richtigen Reihenfolge oder überhaupt beim Empfänger ankommen. Ebenfalls gibt es keine Empfangsbestätigung vom Empfänger an den Sender zurück. Die maximale Länge eines IP-Paketes ist auf 65535 Bytes beschränkt. Da das IP-Protokoll auch für das IP-Routing durch ein Netzwerk verantwortlich ist, kann dieses Protokoll die einzelnen Stationen auch anhand der IP-Adresse identifizieren. Da es ja keine Garantie gibt, dass die Daten ans Ziel gelangen, gibt es im IP-Header des IP-Paketes ein Time-to-Live-Feld (TTL), worin die Lebensdauer eines Datagramms (hier des Paketes) festgelegt wird. Dies dient dazu, damit die Datenpakete nicht unendlich durch das Netz irren und den Datenverkehr belasten. Ist diese Lebensdauer abgelaufen, wird das Datenpaket verworfen.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 28.1   Das IP-Protokoll und die assoziierten Verbindungen


Galileo Computing - Zum Seitenanfang

28.1.6 TCP und UDP  downtop

Aufbauend auf das IP-Protokoll gibt es zwei wichtige Transportprotokolle, TCP/IP (TCP = Transmission Control Protocol) und UDP/IP (UDP = User Datagramm Protocol). Beide Protokolle sind auf der Transport-Ebene angesiedelt.

Der Vorteil von TCP ist, dass hier eine zuverlässige Datenübertragung garantiert wird. Dabei wird bspw. sichergestellt, das ein Paket, welches nach einer gewissen Zeit nicht beim Empfänger ankommt, erneut gesendet wird. Ebenso wird die richtige Reihenfolge der einzelnen Datenpakete von TCP garantiert, in der diese losgeschickt wurden. Zusammengefasst erhalten Sie beim TCP-Protokoll eine Ende-zu-Ende-Kontrolle (Peer-to-Peer), ein Verbindungs-Management (nach dem so genannten Handshake-Prinzip), eine Zeitkontrolle, eine Flusskontrolle sowie eine Fehlerbehandlung der Verbindung. Man spricht bei TCP von einem verbindungsorientierten Transportprotokoll.

Das UPD-Protokoll hingegen verwendet einen verbindungslosen Datenaustausch zwischen den einzelnen Rechnern. Mit UDP haben Sie in Ihren Anwendungen die direkte Möglichkeit, Datagramme zu senden. Allerdings ohne Garantie der Ablieferung eines Datagramms beim Empfänger. Ebenso wenig ist es gegeben, dass die Datagramme in der richtigen Reihenfolge ankommen (es ist sogar möglich, dass Datagramme mehrfach ankommen). Der Vorteil, dass hier weniger Verwaltungsaufwand betrieben werden muss, ist natürlich ein höherer Datendurchsatz, der mit TCP nicht möglich ist. UDP ist bspw. recht interessant für Videoübertragung oder bei Netzwerkspielen. Hierbei ist es nicht so schlimm, wenn das eine oder andere Datenpaket mal nicht ankommt. Die UDP-Strategie kann man gerne mit dem »Erst schießen, dann Fragen«-Motto vergleichen.


Hinweis   Vorwiegend wird in diesem Buch das gängigere TCP-Protokoll beschrieben – aber dennoch wird ggf. auf die Unterschiede zum UDP-Protokoll eingegangen. Allerdings sei gesagt, dass die Unterschiede beider Protokolle in Ihrer Verwendung nicht allzu unterschiedlich sind.



Galileo Computing - Zum Seitenanfang

28.1.7 Was sind Sockets?  toptop

Ein Socket ist eine bi-direktionale (Vollduplex) Software-Struktur, welche zur Netzwerk- oder Interprozess-Kommunikation verwendet wird. Somit ist ein Socket eine Schnittstelle zwischen einem Prozess (Ihrer Anwendung) und einem Transportprotokoll, was meistens das TCP- oder UDP-Protokoll ist.

In den RFC ist ein Socket als ein 5-Tupel aus Ziel- und Quell-IP-Adresse, Ziel- und Quell-Port und dem Netzwerkprotokoll beschrieben. Sockets werden in UDP und TCP verwendet.


RFC (Requests for Comments) sind eine Reihe von technischen und organisatorischen Dokumenten zum Internet (ursprünglich ARPANET), die 1969 begonnen wurde.


Seit 1983 verwendet BSD die Netzwerk-Sockets in seiner Berkeley Sockets API. Ebenso Linux, Solaris und viele andere UNIX’e verwenden die BSD-Sockets. Der Zugriff auf ein Socket erfolgt ähnlich wie auf Dateien mit einem Filedeskriptor – nur mit dem Unterschied, dass es bei Sockets nicht um Dateien geht, sondern um Kommunikationskanäle.

MS-Windows verwendet eine ähnliche API wie von den Berkeley Sockets, dem Windows Sockets (kurz Winsock).

 << zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z
C von A bis Z
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-Programmierung


Zum Katalog: C/C++






 C/C++


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Reguläre Ausdrücke






 Reguläre Ausdrücke


Zum Katalog: Linux






 Linux


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de