Sockelprogrammierung: Häufig gestellte Fragen (FAQ)
Was ist ein Socket?
Ein Socket ist eine einheitliche Schnittstelle zwischen der Internet- und Transportschicht (z.B. TCP/IP) und der Anwendungsschicht (z.B. HTTP). Programme benötigen Sockets, um über ein Netzwerk mit anderen Programmen auf anderen Computern zu kommunizieren.
Welche Geschichte steckt hinter Sockets?
Die Entwicklung von Sockets entstand aus dem Problem, dass es früher keine einheitlichen Parameter und Befehle für die Kommunikation verschiedener Protokolle gab. Anfang der 80er Jahre wurde im Rahmen von BSD-Unix an der University of California in Berkeley die Socket-API entwickelt, die sich als De-facto-Standard etablierte. Microsoft übernahm das Konzept und entwickelte Winsock, das heute die Grundlage der Netzwerkprogrammierung unter Windows bildet.
Was sind die grundlegenden Eigenschaften von Sockets?
Sockets stellen die Kommunikationsschnittstelle zwischen zwei Programmen dar. Es gibt Client- und Server-Sockets, die vom Betriebssystem verwaltet werden und sowohl Daten senden als auch empfangen können. Sie unterstützen Verbindungsaufbau, Datenaustausch und -abschluss und werden durch IP-Adressen (Remote und Local-Host) und Portnummern identifiziert. Berkley-Sockets basieren auf dem "everything-is-a-file"-Konzept, wodurch sie wie Dateien mit I/O-Operationen behandelt werden können (öffnen mit socket(), schließen mit close(), senden mit send()/write(), empfangen mit recv()/read()). Unter Windows wird vor dem Öffnen eines Sockets WSAStartup aufgerufen.
Welche Socket-Typen gibt es?
Es gibt Stream-Sockets (verbindungsorientiert, sicher, meist TCP) und Datagram-Sockets (verbindungslos, meist UDP).
Wie funktioniert die Prozessverwaltung bei mehreren Clients?
Um mehrere Clients gleichzeitig zu verwalten, kann man mehrere Socket-Prozesse erstellen oder den Befehl select() verwenden, um mehrere Prozesse zu überwachen. Wichtig ist dabei die Berücksichtigung der Sicherheit, um Abstürze durch Buffer Overflow zu vermeiden.
Wie funktioniert ein Beispiel-Client-Programm?
Ein Beispiel-Clientprogramm verbindet sich mit einem Server, empfängt Daten und sendet eine Nachricht (z.B. "Hello World"). Unter Windows muss beim Kompilieren mit Dev-C++ der Linker-Parameter "-lwsock32" hinzugefügt werden.
Welche Schritte sind bei der Verwendung von Winsock notwendig?
Ein Beispiel für die notwendigen Schritte in einem Winsock-Programm beinhaltet das Starten von Winsock, das Erstellen eines Sockets, das Herstellen einer Verbindung, das Empfangen und Senden von Daten sowie das Schließen des Sockets und das Aufräumen von Winsock.
Inhaltsverzeichnis
1. Einführung
2. Geschichte
3. Allgemeines
4. Socket Typen
5. Prozessverwaltung
6. Beispielprogramm
- Winsock starten
- Socket erstellen
- Connecten
- Daten empfangen
- Daten senden
- Socket schliesen
- Winsock aufräumen
- Quelltext
7. Literaturverzeichnis
1.) Einführung
Was sind überhaupt Sockets?
Ein Socket (deutscht: Sockel, Stecker) ist ein eine einheitliche Schnittstelle zwischen der Internet und Transportschicht aus dem Internetmodell (Bsp.: TCP/IP) und der Anwedungsschicht (Bsp.: HTTP). Wenn wir also ein Programm schreiben wollen, dass mittels Netzwerk mit einem anderem Programm auf dem anderen Computer kommunizieren sollte, müssen wir auf Sockets zurückgreifen.
2.) Geschichte
Die Entwicklung des Socket-Interfaces lies nicht lange auf sich warten. Es bestand früher das Problem, dass man keine konkreten Parameter und Befehle für die Kommunkationsumsetzung der verschiedenen Protokolle hatte. Und dies hat deutlicht die Programmierung für Netzwerkanwendungen erschwert.
Schließlich entstand Anfang der 80er, im University of California in Berkeley als Ergebnis der langjährigen Forschungsarbeiten ein neues System: BSD-Unix. Es enthielt die API-Socket, die sich schon recht bald als De facto-Standart etablierten. Auch Microsoft übernahm schon recht bald das Socket-Konzept und modellierte daraufhin, das einwenig veränderte Windows Socket (Winsock), dass heute in der zweiten Version vorliegt und die Grundlage der Netzwerkprogrammierung der Windows Betriebssystemen bildet.
3.) Allgemeines
Ein Socket stellt die Kommunikationsschnittstelle zwischen zwei Pogrammen auf der Netzwerkbasis dar. Es gibt insgesamt zwei Socket-Klassen: Client und Server.
Beide werden vom Betriebssystem verwaltet und beide können sowohl Daten verschicken, als auch Daten empfangen.
Die Sockets unterstützen das gängige Netzwerkkonzept:
- Verbindungsaufbau
- Datenaustausch
- Verbindungsende
Sie sind definiert durch die Identifikationsnummer (IP) des Remote, Local-Host und die Portnummer des Remote, Local-Host.
Außerdem arbeiten die Berkley-Sockets auf dem so genannten everything-is-a-file -
Konzept. Das heißt die Sockets können wie gängige Dateien gesehen werden, die per Eingabe/Ausgabe-Behandlung (I/O) behandelt werden können. Genau das verschaffte den Berkley-Sockets soviel Durchsetzungvermögen und Erfolg.
Dabei werden die Sockets wie normale Dateien geöffnet (dafür verwendet man jedoch nicht open(), sondern socket() ) und können wie normale Dateien mit close() geschlossen werden.
Die Daten senden und die Daten empfangen kann man dann mittels write() und read().
Unter Windows haben sich jeodoch die send() and recv() Methoden mehr etabliert. Außerdem muss man beim Windows, bevor man den Socket öffnet ihn mittels des Befehls WSAStarup „aufwärmen“.
4.) Socket Typen
Die Sockets lassen sich jedoch auch noch weiter unterteilen. Es gibt zwei Typen von Sockets die auf der Transportschicht arbeiten: Stream Sockets und Datagram Sockets. Stream Sockets sind dabei die Verbindungsorientieren und sicheren und werden meistens durch das Protokoll TCP vertretten. Datagram Sockets sind die verbindungslosen Sockets und verwenden meistens das Protokoll UDP.
Die Schritte die man dabei vorgeht, sind wie folgt aufgebaut (WINSOCK):
Abbildung in dieser Leseprobe nicht enthalten
5.) Prozessverwaltung
Eines der wichtigen Sachen bei den Sockets stellt das sogenannante handling() auf. Wolle man nun mit dem Server nicht einen Client, sondern 100 gleichzeitig verwalten, reicht da ein Socket nicht aus. Hierfür stehen andere Möglichkeiten zur Verfügung: zum einen könnte man mehrere Socketprozesse kreieren, die einzeln die eingehenden Verbindungen annehmen. Zum anderen könnte man einfach mit dem Befehl select() mehrere Prozesse überwachen und einzeln auf ihre Anfragen reagieren.
Was man jedoch bei den beiden Möglichkeiten beachten sollte, ist die Sicherheit. Denn es ist nämlich ziemlich leicht einen schlecht programmierten, mehrprozessigen Server durch Buffer Overlow (Zu groß verschickte Daten / Zu viele Verbindungen) zum Absturz zu bringen..
6.) Beispiel-Programm
Nun schrieben wir ein kleines Beispiel-Client-Programm. Dabei gehen wir alle wichtigen Schritte von oben bis unten durch. Genau so wie im [C-Worker] Tutorial. Das Programm soll sich am Anfang mit dem Server verbinden, vom ihm erst einmal die Daten empfangen und dann ihm „Hello World“ sendet.
Die Umsetzung erfolgt mit dem Dev-C++ Compiler unter Windows. Achtung! Bevor man zu programmieren anfängt muss man unter
Projekte->Projekt Optionen->Parameter->Linker "-lwsock32" einfügen, um die Winsock Komponente benutzbar zu machen.
1. ) Als erstes wird der Winsock gestartet:
Abbildung in dieser Leseprobe nicht enthalten
- Arbeit zitieren
- Sergej Epp (Autor:in), 2004, Socket-Programmierung, München, GRIN Verlag, https://www.grin.com/document/109556