www.wikidata.de-de.nina.az
Ein Socket von engl Sockel Steckverbindung oder Steckdose ist ein vom Betriebssystem bereitgestelltes Objekt das als Kommunikationsendpunkt dient Ein Programm verwendet Sockets um Daten mit anderen Programmen auszutauschen Das andere Programm kann sich dabei auf demselben Computer Interprozesskommunikation oder einem anderen via Netzwerk erreichbaren Computer befinden Die Kommunikation uber Sockets erfolgt in der Regel bidirektional das heisst uber das Socket konnen Daten sowohl empfangen als auch gesendet werden Inhaltsverzeichnis 1 Funktionsweise 1 1 Allgemeines Funktionsprinzip 1 2 Internet Sockets 2 Ablauf der Socket Kommunikation 2 1 Stream Sockets 2 2 Datagram Sockets 3 Sockets und Interprozesskommunikation 4 Geschichte 5 Verwendung in unterschiedlichen Betriebssystemen 6 Socket Programmierung 6 1 BSD Sockets API 6 2 C 6 3 C 6 4 Java 6 5 Haskell 6 5 1 Einfacher Server 6 5 2 Einfacher Client 6 6 Ruby 6 7 Python 3 6 7 1 Server 6 7 2 Client 6 8 Node js 7 Weblinks 8 EinzelnachweiseFunktionsweise BearbeitenAllgemeines Funktionsprinzip Bearbeiten Sockets bilden eine plattformunabhangige standardisierte Schnittstelle API zwischen der Netzwerkprotokoll Implementierung des Betriebssystems und der eigentlichen Anwendungssoftware Ein Computerprogramm fordert einen Socket vom Betriebssystem an Das Betriebssystem hat die Aufgabe alle benutzten Sockets sowie die zugehorigen Verbindungsinformationen zu verwalten Internet Sockets Bearbeiten Internet Sockets ermoglichen die Kommunikation mittels bestimmter Kommunikationsprotokolle Generell kann man unterscheiden zwischen Stream Sockets und Datagram Sockets Stream Sockets kommunizieren uber einen Zeichen Datenstrom Datagramm Sockets uber einzelne Nachrichten In der Netzwerkkommunikation verwenden Stream Sockets meist TCP Datagramm Sockets ublicherweise UDP TCP ist verlasslicher die Reihenfolge und Zustellung von Paketen werden garantiert Prinzip ganz oder gar nicht UDP ist fur bestimmte Aufgaben effizienter und flexibler oft auch schneller zeitlich Reihenfolge und Zustellung der Pakete werden jedoch nicht garantiert weiterhin sind Duplikate moglich Wahrend Stream Sockets und Datagramm Sockets den TCP oder UDP Header eines Datenpakets normalerweise verbergen und automatisch setzen lassen Raw Sockets Raw roh das Erstellen eigener TCP und UDP Header zu Raw Sockets werden am ehesten in netzwerknahen Applikationen verwendet z B fur Router Packet Sniffer oder bei Packet Injection Ein Socket ist normalerweise die Verbindungsstelle zu einem bestimmten entfernten Programm reprasentiert durch dessen Adressinformation z B IP Adresse und Portnummer Dem Socket selbst ist naturlich auch die eigene Adressinformation zugeordnet Eine Internet Socket Adresse der Familie AF INET wird durch folgende Informationen reprasentiert sin family das heisst der zugehorigen Adressfamilie des Netzwerks z B AF INET Adressfamilie Internetadresse die Identifikationsnummer des localhost seiner 32 Bit IP Adresse die Portnummer des localhost 16 BitDiese Informationen sind allerdings vom verwendeten Protokoll abhangig Typischerweise handelt es sich bei der Adressinformation im Internet um die IP Adresse und den Port Bei UNIX Domain Sockets s u besteht die Identifikation aus einem Dateipfadnamen und der Adressfamilie AF UNIX Ein Server kann entweder auf Anfragen von einer bestimmten Adresse warten und bindet sich von vornherein an diese Adresse oder er wartet auf allen Adressen seines Rechners auf Anfragen Dafur gibt es bei einigen Protokollen eine sogenannte Wildcard Adresse bei der ein oder mehrere Teile der Adressinformation nicht spezifisch sind Im Beispiel von TCP IP und UDP IP ist bei einer Wildcard Adresse nur die Port Nummer relevant das heisst es wird eine spezielle ungultige IP Adresse angegeben um zu signalisieren dass Verbindungen auf allen IP Adressen akzeptiert werden sollen Unter Linux ist diese Wildcardadresse 0 0 0 0 symbolische Konstante INADDR ANY Wenn der Server eine Anfrage von einem Client erhalt wird aus dem lauschenden listening Server Socket der in Verbindung stehende connected Server Socket abgeleitet Der ursprungliche Server Socket bleibt erhalten und wartet weiterhin auf neue Verbindungen wahrend ein neuer auf den bestimmten Client gerichteter Socket geoffnet wird der nur fur die Kommunikation mit diesem einen Client verwendet wird Dieser bleibt solange bestehen bis die Verbindung zum Client von einer der beiden Seiten beendet wird Dieses Ableiten kann dazu genutzt werden eine parallelisierte Serverarchitektur zu schaffen in der sich der Server bei einer Anfrage forkt und ein Kindprozess die Anfrage selbst beantwortet Das heisst dass ein mit einem Client Socket verbundener connected Server Socket genau die gleiche IP Adresse und Port Nummer tragt wie der lauschende listen Server Socket Die Unterscheidung von gleichzeitigen Client Verbindungen zum selben Server erfolgt daher durch das Paar von Server Socket und Client Socket Dieses Paar muss zu jedem Zeitpunkt eindeutig auf jedem der beteiligten Kommunikationspartner sein Als Beispiel sei ein HTTP Server gegeben der auf Port 80 lauscht Die Verbindungen des Servers zu verschiedenen Clients fuhrt zu folgenden eindeutigen Connected Socket Paaren auf dem Server Rechner lt Server IP gt 80 lt Client A IP gt lt Client A Port 1 gt lt Server IP gt 80 lt Client A IP gt lt Client A Port 2 gt lt Server IP gt 80 lt Client B IP gt lt Client B Port 1 gt usw Ablauf der Socket Kommunikation BearbeitenStream Sockets Bearbeiten Client seitig Socket erstellen erstellten Socket mit der Server Adresse verbinden von welcher Daten angefordert werden sollen Senden und Empfangen von Daten evtl Socket herunterfahren shutdown close Verbindung trennen Socket schliessenServer seitig Server Socket erstellen Binden des Sockets an eine Adresse Port uber welche Anfragen akzeptiert werden auf Anfragen warten Anfrage akzeptieren und damit ein neues Socket Paar fur diesen Client erstellen Bearbeiten der Client Anfrage auf dem neuen Client Socket Client Socket wieder schliessen Datagram Sockets Bearbeiten Client seitig Socket erstellen An Adresse sendenServer seitig Socket erstellen Socket binden warten auf PaketeSockets und Interprozesskommunikation BearbeitenUnix Betriebssysteme verwenden zur lokalen Interprozesskommunikation sogenannte POSIX Local Inter Process Communication Sockets auch IPC Sockets von inter process communication sockets oder Unix Domain Sockets Auch hier gibt es Datagram und Stream Sockets da die Kommunikation aber im Kernel stattfindet verhalten sich Stream und Datagram Sockets sehr ahnlich z B besteht hier auch bei Datagram Sockets keine Gefahr von Datenverlust Ein Unix Domain Socket wird als Spezialdatei im Dateisystem reprasentiert Anstelle von IP Adresse und Port Nummer dient der vollstandige Pfad des Sockets als eindeutige Identifikation z B var run snmpd sock Unix Domain Sockets haben fur die IPC gegenuber Verbindungen die die Loopback Schnittstelle nutzen den Vorteil eines wesentlich hoheren Durchsatzes Alternativen zu Sockets in der Interprozesskommunikation sind Pipes oder Shared Memory Geschichte BearbeitenEin zentrales Designprinzip von Unix ist Alles ist eine Datei Die vier am haufigsten benutzten Systemaufrufe fur die Arbeit mit Dateien heissen open zum Offnen read zum Lesen write zum Schreiben und close zum Schliessen Sockets stellen die Umsetzung dieses Designprinzips dar Ursprunglich entwickelt worden ist die Socket API 1983 fur BSD Unix Spater ist die Spezifikation in den Standard POSIX eingeflossen Damit ist sie heute auf jedem POSIX konformen Betriebssystem verfugbar Auch andere Betriebssysteme wie Microsoft Windows Winsock oder OS 2 haben die Socket API ubernommen Die allgemeine Verbreitung von Sockets ist nicht nur dem Design von Sockets sondern auch der allgemeinen Verfugbarkeit des Quellcodes dank der BSD Lizenz geschuldet Verwendung in unterschiedlichen Betriebssystemen BearbeitenUnix und unixartige Betriebssysteme wie Linux benutzen sehr haufig BSD Sockets zur Netzwerkkommunikation Zur lokalen Interprozesskommunikation verwenden sie die oben beschriebenen Unix Domain Sockets die Teil des POSIX Standards sind und mit denen Prozesse auf einfache Art und Weise miteinander kommunizieren konnen Nach der Initialisierung des Sockets kann der Programmierer mit diesem wie mit einer Datei arbeiten Windows verwendet eine den BSD Sockets nachempfundene sogenannte Windows Sockets API Winsock Socket Programmierung BearbeitenBSD Sockets API Bearbeiten Sowohl Unix Sockets als auch Windows Sockets basieren auf der 1983 veroffentlichten BSD Sockets API Fur die nachfolgenden Programmierbeispiele sind wichtige Funktionen dieser API hier kurz zusammengefasst socket Erzeugt ein neues Socket bestimmten Types und alloziert hierfur Systemressourcen Fur die Identifizierung gibt die Funktion eine eindeutige Zahl vom Typ Integer zuruck bind Bindet den Socket an eine Socket Adressinformation in der Regel an eine IP Adresse und Port Wird typischerweise auf Server Seite benutzt listen Versetzt einen gebundenen STREAM TCP IP Socket in einen Lauschen Modus Wird auf Server Seite benutzt connect Macht die Adressinformation z B IP Adresse und Port eines anderen Sockets bekannt Ordnet dem Socket einen freien lokalen Port zu Im Falle eines STREAM Sockets wird versucht eine neue TCP IP Verbindung zu etablieren Wird auf Client Seite benutzt accept Akzeptiert einen eingehenden Versuch Anfrage eine neue TCP IP Verbindung zu einem entfernten Client aufzubauen und erzeugt im Erfolgsfall ein neues Socket assoziiert mit dem Adress Paar der Verbindung Dieses neu erzeugte Socket wird von der Funktion zuruckgegeben Wird auf Server Seite benutzt send und recv oder write und read oder sendto und recvfrom Schreibt liest Daten an von Socket s Hinweis Ein einmaliger Funktionsaufruf von recv garantiert nicht den Empfang aller vom Sender mittels send gesendeten Daten insbesondere nicht bei STREAM Sockets close Veranlasst das Betriebssystem alle fur das Socket allozierten Ressourcen freizugeben Liegt ein TCP IP Socket vor wird die Verbindung beendet C Bearbeiten Die abgeleitete POSIX Sockets API von Linux ist in C geschrieben Ein Beispiel fur einen TCP Verbindungsaufbau eines Clients zu einem Server int sockfd socket AF INET SOCK STREAM 0 Erzeuge Socket struct sockaddr in srv memset amp srv 0 sizeof struct sockaddr in srv sin family AF INET inet pton AF INET 1 2 3 4 amp srv sin addr Schreibe IP Adresse des Servers in die sockaddr in Struktur srv sin port htons 1234 Schreibe Port in Network Byte Order Big Endian in das Feld sin port connect sockfd struct sockaddr amp srv sizeof struct sockaddr in Verbindung herstellen Ab jetzt kann mit write und read aus dem Socket gelesen und in das Socket geschrieben werden Datenaustausch shutdown sockfd SHUT WR Sende ein EOF Byte sodass der Server beim nachsten read als Ruckgabewert 0 bekommt und die Verbindung beenden kann close sockfd C Bearbeiten set IP adress and port for remote host IPAddress ipAddress IPAddress Parse 192 168 xxx yyy IPEndPoint ipEndPoint new IPEndPoint ipAddress 9999 Socket sock new Socket ipEndPoint AddressFamily SocketType Stream ProtocolType Tcp open socket sock Connect ipEndPoint check if socket is connected if sock Connected endless loop while true set receive buffer and length is buffer big enough byte bytesReceived new byte 1024 int bytes 0 send message byte msg1 new byte 256 set your bytes ASCII or whatever sock Send msg1 msg1 Length SocketFlags None receive message bytes sock Receive bytesReceived bytesReceived Length SocketFlags None sock Shutdown SocketShutdown Both sock Close Java Bearbeiten Java als plattformunabhangige Programmiersprache unterstutzt im Paket java net unmittelbar die Socket Programmierung Das zeigt die Betriebssystemunabhangigkeit des Socket Konzeptes Die Implementierung der Sockets fur die verschiedenen Plattformen Linux Windows Spezialsysteme erfolgt in der Klassenbibliothek der virtuellen Maschine Die Klassen fur die Socket Programmierung sind Socket und ServerSocket Folgendes Kurzbeispiel zeigt die Verwendung ServerSocket serverSocket new ServerSocket port Serversocket mit bestimmter Port Nummer erstellen while true Socket clientSocket serverSocket accept auf Anfragen warten InputStream input clientSocket getInputStream InputStream Objekt offnen byte data new byte 1024 Datenpuffer deklarieren anlegen int numBytes 0 Variable fur Anzahl der tatsachlich gelesenen Bytes numBytes input read data Daten lesen gelesene Daten verarbeiten clientSocket close Verbindung schliessen Weiterhin gibt es in der aktuellen Java Version die Moglichkeit Sockets uber die NewIO nio Bibliothek anzusprechen Der Code ist etwas aufwandiger kann jedoch schneller ausgefuhrt werden Das Multiplexing mehrerer Sockets geschieht uber einen so genannten Selector vergleichbar dem Unix Systemaufruf select Haskell Bearbeiten Die rein funktionale Programmiersprache Haskell bietet durch das Modul Network eine plattformunabhangige Moglichkeit zur Verwendung von Sockets Das folgende Beispiel beinhaltet den vollstandigen Code fur einen sehr einfachen Server und einen korrespondierenden Client Der Client nimmt Textzeilen von der Standardeingabe entgegen und schickt diese uber den Netzwerk Socket an den Server Dieser wiederum gibt die Textzeilen auf die Standardausgabe aus Der hier gezeigte Server ist insofern einfach als er z B eine sichere Beendigung wahrscheinlich nicht ermoglicht Eine Losungsmoglichkeit wird in haskell org 1 unter Verwendung von Software Transactional Memory STM aufgezeigt Einfacher Server Bearbeiten module Main where import Control Concurrent import Control Monad import System IO import Network main IO main withSocketsDo do theSocket lt listenOn PortNumber 2048 forever acceptConnectionAndFork theSocket echoServer type MessageHandler Handle String PortNumber gt IO acceptConnectionAndFork Socket gt MessageHandler gt IO acceptConnectionAndFork theSocket handler do connection lt accept theSocket forkIO handler connection return echoServer MessageHandler echoServer handle hostname portnumber do putStrLn hostname show portnumber Open c lt hGetContents handle mapM putStrLn hostname show portnumber Msg show l l lt lines c putStrLn hostname show portnumber Close Einfacher Client Bearbeiten module Main where import Network import System IO import Control Concurrent main IO main withSocketsDo do handle lt connectTo localhost PortNumber 2048 input lt getContents sequence do hPutStrLn handle l hFlush handle l lt lines input hClose handle Ruby Bearbeiten In Ruby stellt die Standardbibliothek socket ebenfalls plattformunabhangig eine Schnittstelle zur Programmierung von TCP Sockets zur Verfugung Ein sehr einfacher Server mit Multithreading der einen Text an den Client schickt require socket port 2048 server TCPServer new port loop do client server accept Thread start client do c c puts Hello c close end end Python 3 Bearbeiten Ein einfaches Programm das uber den Client Nachrichten an den Server schickt Server Bearbeiten import socket Server host 127 0 0 1 IP adress of the Server port 5000 Port used by the server s socket socket s bind host port s listen 1 while True client addr s accept print f Connected to addr while True data client recv 1024 if not data break print f Received from client data decode client sendall data Client Bearbeiten import socket host 127 0 0 1 IP adress of the Server port 5000 Port used by server s socket socket s connect host port while True msg str input Message gt s sendall msg encode data s recv 1024 print f Received from server data decode Node js Bearbeiten In Node js ermoglicht das Standardmodul net die Programmierung von TCP Sockets var net require net var server net createServer function socket socket write Echo server r n socket pipe socket server listen 1337 127 0 0 1 Weblinks BearbeitenUNIX Programmer s Supplementary Documents PSD 20 1 PDF englisch Socket Programmierung in Python englisch Realistisches Beispiel fur die Konstruktion eines Socket Servers mit sicherer Beendigung in Haskell Sockets GNU info Page englisch Einzelnachweise Bearbeiten Concurrency demos Graceful exit auf wiki haskell org Abgerufen von https de wikipedia org w index php title Socket Software amp oldid 235807986