Programmieren mit C++

Code-Beispiele & Lösungen

Klassen für allgemeine Aufgaben

Die Socket-Klasse

Sockets sind Kommunikationsendpunkte. Mit Sockets kann in einem Netzwerk zwischen unterschiedlichen Computern kommuniziert werden. Sie wurden durch das Unix-Betriebssystem allgemein zur Verfügung gestellt. Andere Betriebssysteme passen sich an die Sockets der Internet-Domäne an. Ursprünglich wurden Sockets für das TCP/IP-Protokoll entwickelt. Inzwischen liegen auch andere Anbindungen vor. Sockets in Verbindung mit dem TCP/IP-Protokoll besitzen mit großem Abstand die weiteste Verbreitung.

Kommunikationsendpunkte

Sockets werden in der Internetdomäne eindeutig identifiziert durch

  • Internetadresse
  • Portnummer

Die Internetadresse dient zur Identifizierung des Hosts, während die Portnummer den Prozeß bestimmt. Es ist möglich, feste Portnummern zu verwenden, so daß die Gegenstelle die Verbindung immer in der gleichen Weise aufbauen kann.

Internetdomäne

Die C++ Klasse für Sockets ist für viele Betriebssysteme verwendbar. Die vorliegende Implementierung ist für Windows NT. Diese Version ist ohne großartige Änderungen auch für Windows 95 einsetzbar. Versionen für Linux oder andere Unix-Derivate bedürfen einer eigenen Implementierung. Die Klassenschnittstelle kann bei diesen Versionen für die relevanten Teile gleich bleiben. Dies bedeutet, daß die Socketklasse, wenn man sich beschränkt, für alle Systeme identisch anzuwenden ist.

Klasse für unterschiedliche Betriebssysteme

Die Beschränkungen liegen darin, die Microsoft-spezifischen Erweiterungen nicht zu verwenden. Microsoft hat für Windows 3.1 eine eigene Socketschnittstelle definiert. Diese Schnittstelle wurde als WINSOCK bekannt. Grund für diese eigene Schnittstelle war die Eigenart des Betriebssystems, kein preemptives Multitasking zu unterstützen. Aus diesem Grund kann keine blockierende Socketkommunikation verwendet werden. Antwortet der Kommunikationspartner nicht unmittelbar, so steht das komplette Betriebssystem.

Microsoft-Socket-Erweiterungen

Microsoft hat daher die Socketkommunikation asynchron gestaltet. Die Socketfunktionen blockieren nicht im Funktionsaufruf, sondern es werden weiterhin Nachrichten der Applikation in einer Schleife bearbeitet. Aus diesem Grund könnten aber aufgrund der Programmlogik mehrere Socketfunktionen parallel ausgeführt werden. Dieser Zustand ist vom Programm her zu erkennen und zu vermeiden.

Asynchrone Sockets

Bei den neueren Betriebssystemen Windows 95 und Windows NT führt das Betriebssystem preemptives Multitasking durch. Die asynchronen Socketaufrufe gehören somit der Vergangenheit an. Unix und Windows NT (Windows 95) sind bezüglich der Socketprogrammierung ähnlich. Die Socketkommunikation wird von je einem eigenen Thread durchgeführt. Dieser Thread kann blockierende Socketaufrufe durchführen. Der Rest der Applikation arbeitet weiter. Von der Programmlogik ist dieses Modell leichter verständlich als die asynchronen Socketaufrufe.

Windows 95 und Windows NT

Somit ist es auch möglich Programme für Windows NT (Windows 95) und Unix bezüglich Socketkommunikation portabel zu programmieren. Ein weiterer Schritt in Richtung Portabilität ist das Abkapseln der Socketschnittstelle in eine C++-Klasse. Diese Klasse ist für alle Betriebssysteme identisch, zumindest was die public Schnittstelle und damit das Anwenden der Klasse betrifft. Die Implementierung ist nicht identisch.

Die vorliegende Bibliothek umfaßt drei Klassen

  • Socket
  • Streamsocket
  • Datagramsocket

Die Klasse Socket ist die Basisklasse, von der die beiden anderen Klassen abgeleitet sind. Diese sind für das TCP/IP-Protokoll ausgelegt. Streamsocket verwendet das TCP-Protokoll und arbeitet verbindungsorientiert, während Datagramsocket auf dem UDP-Protokoll basiert und verbindungslos ist.

Basisklasse Socket

Die Basisklasse Socket verfügt über die gesamte Funktionalität, die sowohl bei Streamsockets als auch bei Datagramsockets vorhanden ist. Lediglich beim Senden und Empfangen von Daten unterscheiden sich die Socketarten. Diese Funktionalität ist in den jeweiligen Klassen implementiert.

Portabilität

Aufzählungstyp WINSOCKETSTATUS

typedef enum WINSOCKETSTATUS {nichtinitialisiert, initialisiert} WINSOCKETSTATUS;

In der Version für Windows NT wird die WINSOCK-Bibliothek im Konstruktor initialisiert. Um im Objekt den Status der Initialisierung zu kennen existiert der Aufzählungstyp WINSOCKETSTATUS, der folgende Werte annehmen kann:

  • nicht initialisiert
  • initialisiert

Die Basisklasse Socket verfügt über zwei private Datenelemente, die auch nur in der Microsoft-Version vorhanden sind.

Private Datenelemente

 WSAData  WSADaten;

Die Variable vom Typ WSAData wird für die Initialisierung der WINSOCK-Bibliothek benötigt. Bei dieser Initialisierung wird die Struktur mit Daten von der Bibliothek gefüllt.

Variable WSADaten

 WORD   wWinsockVersion;

Die Variable wWinsockVersion enthält die benötigte Version der WINSOCK-Bibliothek. Sie ist mit 1.1 initialisiert.

Variable wWinsockVersion

In der Struktur vom Typ WSAData befinden sich die nachfolgenden Elemente.

Struktur WSAData

WORD   wVersion

Die Variable wVersion vom Typ WORD gibt die Version an, die die WINSOCK-Bibliothek unterstützt.

Variable wVersion

WORD  wHighVersion

Die Variable wHighVersion vom Typ WORD gibt die höchste Version an, die die WINSOCK-Bibliothek unterstützen kann. Der Inhalt dieser Variablen ist in der Regel identisch mit dem Wert der Variablen wVersion.

Variable wHighVersion

char szDescription[WSADESCRIPTION_LEN+1]

Das Characterarray szDescription enthält eine Beschreibung der Implementierung der WINSOCK-Bibliothek. Hier steht in der Regel der Name des Herstellers.

Variable szDescription

char  szSystemStatus[WSASYS_STATUS_LEN+1]

Das Characterarray szSystemStatus enthält Status oder Konfigurationsinformationen. Bei der Microsoft-WINSOCK-Implementierung steht hier der Text running.

Variable szSystemStatus

unsigned short  iMaxSockets

Die Variable iMaxSockets vom Typ unsigned short gibt die maximal zur Verfügung stehende Socketanzahl bei dieser Implementierung zurück. In Windows NT ist dieser Wert 32767.

Variable iMaxSockets

unsigned short  iMaxUdpDg

Die Variable iMaxUdpDg vom Typ unsigned short enthält die maximale Größe der Datagramme des UDP-Protokolls in Bytes. Sie ist 65527.

Variable iMaxUdpDg

char FAR *  lpVendorInfo

Im Characterarray lpVendorInfo kann jeder Hersteller eigene Informationen unterbringen.

Geschützte Elemente

Die Klasse Socket verfügt über drei geschützte Elemente:

Variable lpVendorInfo

WINSOCKETSTATUS WSStatus;

WSStatus enthält den Status der WINSOCK-Bibliothek bezüglich der Initialisierung.

Variable WSStatus

Int nFehler;

nFehler enthält 0, wenn bei der letzten aufgerufenen Memberfunktion kein Fehler auftrat. Trat ein Fehler auf, so enthält die Variable den Fehlercode der WINSOCK-Bibliothek, der mit der Funktion WSAGetLastError ermittelt wurde.

Variable nFehler

SOCKET sSocket;

sSocket enthält den Socketdeskriptor. Dieser Deskriptor wird bei nahezu allen WINSOCK-Bibliotheksaufrufen benötigt.

Die Funktionen der Klasse Socket sind public.

Socket(void)

Variable sSocket

Der Konstruktor benötigt keinen Parameter. In der Windows-NT-Version initialisiert er die WINSOCK-Bibliothek durch den Funktionsaufruf WSAStartup. Nachdem die Bibliothek initialisiert ist, können die Funktionen dieser Bibliothek verwendet werden.

Konstruktor

virtual ~Socket()

Der Destruktor schließt den Socket und deinitialisiert die WINSOCK-Bibliothek durch den WSACleanup-Funktionsaufruf.

Die folgenden sieben Memberfunktionen sind nur bei der Microsoft-Version der Socket-Klasse relevant. Sie liefern die Daten aus der WSAData-Struktur, die bei der Initialisierung der WINSOCK-Bibliothek erhalten wurden.

Destruktor

int nVersion(int& nUnterversion)

nVersion liefert die Version der WINSOCK-Bibliothek als Funktionsergebnis. Über den Parameter nUnterversion erhält der Aufrufer die Unterversionsnummer. Ist die Initialisierung der WINSOCK-Bibliothek fehlgeschlagen, so liefert die Funktion 0 als Ergebnis.

Memberfunktion nVersion

int nHoechsteVersion(int& nUnterversion)

nHoechsteVersion liefert die höchste Version, die von der WINSOCK-Bibliothek unterstützt wird. Die Aufteilung von Versions- und Unterversionsnummer ist identisch derjenigen bei der Funktion nVersion. Ist die Initialisierung der WINSOCK-Bibliothek fehlgeschlagen, so liefert die Funktion 0 als Ergebnis.

Memberfunktion nHoechsteVersion

char   *pszBeschreibung()

pszBeschreibung liefert die Beschreibung des Herstellers. Ist die Initialisierung der WINSOCK-Bibliothek fehlgeschlagen, so liefert die Funktion einen Leerstring als Ergebnis.

Memberfunktion pszBeschreibung

char   *pszSystemStatus()

pszSystemStatus liefert den Systemzustand der WINSOCK-Bibliothek. Ist die Initialisierung der WINSOCK-Bibliothek fehlgeschlagen, so liefert die Funktion einen Leerstring als Ergebnis.

Memberfunktion pszSystemStatus

unsigned short uiVerfuegbareSockets()

uiVerfuegbareSockets gibt die Anzahl der zur Verfügung stehenden Sockets zurück. Ist die Initialisierung der WINSOCK-Bibliothek fehlgeschlagen, so liefert die Funktion 0 als Ergebnis.

Memberfunktion uiVerfuegbareSockets

unsigned short uiDatagramGroesse()

Die Memberfunktion uiDatagramGroesse gibt die maximale Datagrammgröße der UDP-Pakete zurück. Ist die Initialisierung der WINSOCK-Bibliothek fehlgeschlagen, so liefert die Funktion 0 als Ergebnis.

Memberfunktion uiDatagramGroesse

char   *pszHerstellerInfo()

pszHersteller gibt die herstellerspezifischen Informationen zurück. Ist die Initialisierung der WINSOCK-Bibliothek fehlgeschlagen, so liefert die Funktion einen Leerstring als Ergebnis.

Die weiteren Funktionen sind nicht Microsoft-spezifisch.

Memberfunktion pszHersteller

int nAccept(SOCKET& sNeuerSocket, 
            unsigned long& ulIPAdresse, 
            unsigned short& usPort)

nAccept akzeptiert eine Verbindung und liefert einen Socket für diese Verbindung zurück. Ein Server bindet seinen Socket an einen Port. Unter dieser Portnummer ist er ständig für eingehende Anfragen verfügbar. Will ein Client mit ihm kommunizieren, akzeptiert der Server durch den Funktionsaufruf accept diese Verbindung. Von der Socketbibliothek wird ein neuer Socket erzeugt, der mit dem Client kommuniziert. Dieser Socket wird zurückgegeben. Der ursprüngliche Socket bleibt weiterhin an den bekannten Port gebunden, um dort erreichbar zu sein.

nAccept liefert den neuen Socket als ersten Parameter zurück. In den Parametern zwei und drei erhält der Aufrufer die Internetadresse und die Portnummer des Clients, der mit Server kommunizieren will. Verlief der accept-Funktionsaufruf fehlerfrei, so gibt die Funktion nAccept 0 zurück. Im Fehlerfall erhält man den Fehlercode der WINSOCK-Bibliothek.

Memberfunktion nAccept

int nBind(unsigned long ulIPAdresse, 
          unsigned short usPort)

nBind bindet einen Socket an einen lokalen Port. Diese Funktion ist wichtig, wenn ein Serverdienst immer unter derselben Portnummer erreichbar sein soll. Die Funktion benötigt als Parameter die Internetadresse des lokalen Computers und die Portnummer, an die der Socket gebunden werden soll. Konnte der Socket nicht an den lokalen Port gebunden werden, liefert die Funktion den WINSOCK Fehlercode. Verlief das Binden erfolgreich, so ist das Funktionsergebnis 0.

Memberfunktion nBind

int nBind(char *pszIPAdresse, 
          unsigned short usPort)

nBind ist funktional identisch mit der überlagerten nBind Memberfunktion. Bei dieser Version ist im ersten Parameter die Internetadresse des lokalen Computers als Zeichenkette (10.10.10.100) zu übergeben.

Memberfunktion nBind

int nListen(int nVerbindungen = 5)

nListen ist für Server. Ein Server hört auf eine Verbindung. Nachdem der Socket erzeugt und an einen bestimmten Port gebunden wurde, muß der Server auf eingehende Verbindungen hören. Erst nach dem Aufruf der Memberfunktion nListen ist die Kommunikationsbereitschaft hergestellt.

Die Bibliothek verwaltet eine Queue von eingehenden Verbindungen. Im Bereich von bis zu 5 Verbindungen läßt sich die Größe der Empfangsqueue über den Parameter der Funktion nVerbindungen beeinflussen. Der Parameter ist standardmäßig auf die maximale Anzahl gesetzt. Akzeptiert der Server eine Verbindung mit der Memberfunktion nAccept, so wird, wenn der Server mehrere Clients parallel bedienen will, in der Regel ein neuer Thread für die Verbindung erzeugt, und die komplette Empfangsqueue steht erneut für neue Verbindungen zur Verfügung.

Memberfunktion nListen

int nSetsockopt(int nOption, 
                int nWert)

nSetsockopt gestattet das Beeinflussen des Socket-Verhaltens. Der Funktion dürfen je nach erstem Parameter Integer- oder boolesche Werte übergeben werden. Die booleschen Werte sind aber vom Datentyp auch Integerwerte. 0 bedeutet FALSE, ungleich 0 bedeutet TRUE. Der erste Parameter bedeutet die Art, die verändert werden soll, der zweite Parameter bestimmt den neuen Wert. Die möglichen Optionen sind:

SO_BROADCAST

SO_OOBINLINE

SO_DEBUG

SO_RCVBUF

SO_DONTLINGER

SO_REUSEADDR

SO_DONTROUTE

SO_SNDBUF

SO_KEEPALIVE

TCP_NODELAY

Die folgenden Optionen sind unter Windows NT nicht verfügbar, sie existieren nur im BSD-Unix:

  • SO_RCVLOWAT
  • SO_RCVTIMEO
  • SO_SNDLOWAT
  • SO_SNDTIMEO
  • IP_OPTIONS

Die Optionen SO_RCVBUF, SO_SNDBUF, SO_ERROR, SO_RCVLOWAT, SO_RCVTIMEO, SO_SNDLOWAT, SO_SNDTIMEO und SO_TYPE sind vom Typ int, die anderen vom Typ Boolean.

Memberfunktion nSetsockopt

SO_BROADCAST erlaubt das Senden von Broadcast-Nachrichten über Sockets. Broadcast-Meldungen waren in früheren Unix Systemen privilegierte Nachrichten.

Option SO_BROADCAST

SO_DEBUG erlaubt die Aufzeichnung von Aktionen der unteren Protokollschichten für Debugzwecke.

Option SO_DEBUG

Ist SO_DONTLINGER gesetzt, so wird vom System ein closesocket-Funktionsaufruf sofort ausgeführt, selbst wenn noch Daten für diesen Socket bereit sind, die noch nicht gelesen wurden.

Option SO_DONTLINGER

SO_DONTROUTE bestimmt, daß ausgehende Nachrichten nicht vom Standard-Routingsystem behandelt werden.

Option SO_DONTROUTE

SO_KEEPALIVE erlaubt der Protokollschicht das Senden von Nachrichten, um zu erkennen, ob die Verbindung in Ordnung ist.

Option SO_KEEPALIVE

Durch SO_OOBINLINE werden Out-Of-Band-Daten im normalen Datenstrom an den Empfänger übermittelt. Somit können die Daten durch die normalen Leseaufrufe ohne gesetztes MSG_OOB-Flag gelesen werden.

Option SO_OOBINLINE

SO_RCVBUF gestattet die Veränderung der Puffergröße für den Empfangspuffer. Durch die Änderung der Größe kann der Socket für unterschiedliche Datenmengen konfiguriert werden, um den Durchsatz zu optimieren.

Option SO_RCVBUF

SO_REUSEADDR erlaubt das Binden mehrerer lokaler Sockets an einen Port. Normalerweise kann nur ein Socket an einen Port gebunden werden. Wird ein weiterer Versuch unternommen, so erhält man die Fehlermeldung, daß die Adresse bereits benutzt ist.

Option SO_REUSEADDR

SO_SNDBUF gestattet die Veränderung der Puffergröße für den Sendepuffer. Durch die Änderung der Größe kann der Socket für unterschiedliche Datenmengen konfiguriert werden, um den Durchsatz zu optimieren.

Option SO_SNDBUF

TCP_NODELAY ist eine TCP-Protokoll-Option. Beim TCP-Protokoll werden die Datenpakete nicht 1:1 übertragen. Beim UDP-Protokoll findet die Übertragung immer 1:1 statt. Beim TCP-Protokoll werden voreingestellt mehrere zu sendende Daten (mehrere send-Aufrufe) zusammengefaßt, um die Übertragung optimal zu gestatten (geringer Protokoll-Overhead). Diese Option verhindert das Zusammenfassen.

Option TCP_NODELAY

SO_RCVLOWAT gibt die Anzahl der minimal zu empfangenden Zeichen an. Die Funktion recv blockiert, wenn keine empfangenen Daten zur Verfügung stehen, so lange, bis mindestens ein Zeichen empfangen wurde. Wird mit der Option der Wert SO_RCVLOWAT höher gesetzt, so blockiert die Funktion so lange, bis die mit der Option gesetzte Anzahl Zeichen empfangen wurde oder bis so viele Zeichen bereit sind, wie mit dem recv Aufruf gelesen werden sollen, je nachdem, welcher Wert geringer ist.

Option SO_RCVLOWAT

SO_RCVTIMEO setzt den Timeout-Wert für den Empfang von Daten. Dieser Wert gilt bei jedem empfangenen Paket wieder von neuen.

Option SO_RCVTIMEO

SO_SNDLOWAT setzt die Anzahl der Zeichen, die als eine Nachricht minimal gesendet werden müssen.

Option SO_SNDLOWAT

SO_SNDTIMEO setzt analog zur Option SO_RCVTIMEO einen Timeout-Wert für das Senden von Paketen.

Option SO_SNDTIMEO

IP_OPTIONS ist eine IP-Protokoll-Option. Das Optionenfeld im IP Header wird mit dem Wert dieser Option gefüllt.

Option IP_OPTIONS

int nSetLingerwerte(int fOn, 
                    int nZeit = 0)

nSetLingerwerte beeinflußt das Verhalten der closesocket-Funktion. Sind noch Daten für einen Socket zum Lesen vorhanden, und es wird versucht, den Socket zu schließen, so gibt es zwei Möglichkeiten:

  • Schließen des Sockets und Verwerfen der Daten
  • Blockieren des closesocket-Funktionsaufrufs

Soll der closesocket-Funktionsaufruf blockiert werden, so muß der erste Funktionsparameter einen Wert ungleich 0 enthalten. Der zweite Parameter gibt den Timeout-Wert an. Der closesocket-Funktionsaufruf wird diese Zeitspanne blockiert, wenn in der Zwischenzeit die restlichen Daten nicht gelesen werden. Nach der Timeoutzeit wird der Socket geschlossen, auch wenn die Daten noch nicht gelesen wurden.

Ist der erste Parameter 0, so wird der Socket sofort geschlossen, und die Daten werden verworfen. Der zweite Parameter spielt in diesem Fall keine Rolle.

Memberfunktion nSetLingerwerte

int nGetsockopt(int nOption)

nGetsockopt gestattet das Abfragen des Verhaltens des Sockets. Der Funktion dürfen je nach erstem Parameter Integer- oder boolesche Werte übergeben werden. Die booleschen Werte sind aber vom Datentyp auch Integerwerte. 0 bedeutet FALSE, ungleich 0 bedeutet TRUE. Der erste Parameter bedeutet die Art, die verändert werden soll. Der zweite Parameter bestimmt den neuen Wert. Die möglichen Optionen sind:

SO_ACCEPTCONN

SO_OOBINLINE

SO_BROADCAST

SO_RCVBUF

SO_DEBUG

SO_REUSEADDR

SO_DONTLINGER

SO_SNDBUF

SO_DONTROUTE

SO_TYPE

SO_ERROR

TCP_NODELAY

SO_KEEPALIVE

 

Die folgenden Optionen sind unter Windows NT nicht verfügbar, sie existieren nur im BSD Unix:

  • SO_RCVLOWAT
  • SO_RCVTIMEO
  • SO_SNDLOWAT
  • SO_SNDTIMEO
  • IP_OPTIONS
  • TCP_MAXSEG

Die Optionen SO_BROADCAST, SO_DEBUG, SO_DONTLINGER, SO_DONTROUTE, SO_KEEPALIVE, SO_OOBINLINE, SO_RCVBUF, SO_REUSEADDR, SO_SNDBUF, TCP_NODELAY, SO_RCVLOWAT, SO_RCVTIMEO, SO_SNDLOWAT, SO_SNDTIMEO und IP_OPTIONS geben die aktuell gesetzten Werte zurück. Die Bedeutung ist identisch mit derjenigen beim Setzen der Optionen.

Memberfunktion nGetsockopt

SO_ACCEPTCONN liefert TRUE, wenn sich der Socket im Listenmodus befindet.

Option SO_ACCEPTCONN

SO_ERROR gibt den Fehlercode des zuletzt aufgetretenen Fehlers zurück. Der Fehlerstatus wird durch diesen Funktionsaufruf gelöscht.

Option SO_ERROR

SO_TYPE gibt die Art des Sockets zurück (SOCK_STREAM). Diese Option wird benötigt, wenn der Socket bei einem Server, der für jede Verbindung einen eigenen Prozeß startet, geerbt wird und die Art der Verbindung festgestellt werden muß.

Option SO_TYPE

TCP_MAXSEG gibt die maximale Segmentgröße des TCP-Protokolls an.

Option TCP_MAXSEG

int nGetLingerwerte(int& fOn, 
                    int& nZeit)

nGetLingerwerte liefert die Linger-Werte zurück. Die Bedeutung des Verhaltens und der Parameter ist bei der Funktion nSetLingerwerte beschrieben.

Memberfunktion nGetLingerwerte

int nConnect(unsigned long ulIPAdresse, 
             unsigned short usPort)

nConnect baut die Verbindung zu einem anderen Socket auf. Der Socket der Gegenstelle ist über die Internetadresse des Computers und die Portnummer eindeutig adressierbar. Deshalb muß der Socket der Gegenstelle an einen Port gebunden worden sein. Selbstverständlich kann die Socketkommunikation auch eingesetzt werden, wenn beide Kommunikationspartner im selben Computer vorhanden sind. Die Werte für die Internetadresse und die Portnummer des gewünschten Kommunikationspartners müssen der Funktion als Parameter übergeben werden.

Memberfunktion nConnect

int nConnect(char *pszIPAdresse, 
             unsigned short usPort)

Der überladenen Memberfunktion nConnect muß als erster Parameter die Internetadresse des Kommunikationspartners als Zeichenkette (10.10.10.100) übergeben werden. Das weitere Verhalten ist identisch mit dem der anderen überlagerten Memberfunktion.

Memberfunktion nConnect

int nGetPeername(unsigned long& ulIPAdresse, 
                 unsigned short& usPort)

nGetPeername liefert die Identifikation des Kommunikationspartners. Wenn ein Socket eine Verbindung zu einem anderen Socket aufgebaut hat, so können mit dieser Memberfunktion die Internetadresse und die Portnummer des Sockets des Kommunikationspartners ermittelt werden.

Memberfunktion nGetPeername

int nGetSockname(unsigned long& ulIPAdresse, 
                 unsigned short& usPort)

nGetSockname liefert dieselben Daten wie die Memberfunktion nGetPeername, allerdings vom eigenen Socket. Diese Funktion mag unsinnig erscheinen, da man doch die Werte der eigenen Internetadresse und des eigenen Ports kennt. Erhält aber ein Programm einen Socket von einem anderen Prozeß vererbt, so kennt der Erbende diese Werte möglicherweise nicht.

Memberfunktion nGetSockname

int nGetFehler(void)

nGetFehler liefert den Fehlercode der zuletzt aufgerufenen Socketfunktion.

Klasse StreamSocket

Die Klasse StreamSocket ist ausgelegt für Sockets, die das TCP-Protokoll verwenden.

Memberfunktion nGetFehler

StreamSocket(void);

Der Konstruktor erzeugt einen Socket für das TCP-Protokoll. Der Socket wird in der Internetdomäne angelegt.

Konstruktor

int nRecv(char *pchBuffer, 
          long lAnzahlBytes, 
          int nFlags = 0)

nRecv empfängt Daten. Die Daten werden in dem Puffer abgelegt, auf den der erste Parameter zeigt. Die Größe der empfangenen Daten wird im zweiten Parameter übergeben. Der dritte Parameter bestimmt die Optionen, die der Funktion recv übergeben werden können. Die beiden Möglichkeiten sind:

  • MSG_PEEK
  • MSG_OOB

Memberfunktion nRecv

MSG_PEEK liefert die eingehenden Daten, läßt sie aber gleichzeitig in der Eingangsqueue, so daß sie noch einmal gelesen werden können.

Option MSG_PEEK

MSG_OOB liefert Out-Of-Band-Daten, falls der Socket so konfiguriert ist. TCP ist ein gesichertes Protokoll. Die Reihenfolge der Daten bleibt durch die Übertragung gewährleistet. Da es aber von fast jeder Regel Ausnahmen gibt, kann es bei der TCP-Übertragung auch vorkommen, daß für gewisse Daten die Reihenfolge nicht eingehalten werden soll, sondern daß diese Daten möglichst schnell (vor den anderen bereits übertragenen, aber noch nicht gelesenen Daten) an den Empfänger übermittelt werden sollen. Ist der Streamsocket entsprechend konfiguriert, so werden diese Out-Of-Band-Daten bevorzugt durch die Funktion recv geliefert.

Option MSG_OOB

int nSend(char *pchBuffer, 
          long lAnzahlBytes, 
          int nFlags = 0)

nSend sendet Daten an den Kommunikationspartner. Die ersten beiden Parameter geben die Daten und die Länge in Bytes an. Der dritte Parameter bestimmt das Verhalten der Funktion send. Die beiden möglichen Werte sind:

  • MSG_DONTROUTE
  • MSG_OOB

Memberfunktion nSend

MSG_DONTROUTE gibt an, daß die Daten nicht in andere Netze geroutet werden sollen.

Option MSG_DONTROUTE

MSG_OOB gibt an, daß diese Daten Out-Of-Band-Daten sind, die nicht in der üblichen Reihenfolge beim Empfänger ankommen sollen, sondern dem Empfänger übermittelt werden, sobald sie eintreffen.

Klasse DatagramSocket

Die Klasse DatagramSocket ist für Sockets mit UDP-Protokoll.

Option MSG_OOB

DatagramSocket(void)

Der Konstruktor erzeugt einen Socket für das UDP-Protokoll. Der Socket wird in der Internetdomäne erzeugt.

Konstruktor

int nRecvFrom(unsigned long ulIPAdresse, 
              unsigned short usPort, 
              char *pchBuffer, 
              long lAnzahlBytes, 
              int nFlags = 0)

nRecvFrom empfängt Daten. Das UDP-Protokoll ist verbindungslos. Somit braucht für eine Übertragung von Daten nicht zuerst eine Verbindung aufgebaut zu werden. Es können unmittelbar nach dem Erzeugen und Binden des Sockets an einen Port Daten empfangen werden. Die ersten beiden Parameter beschreiben die Gegenstelle, von der die Daten empfangen wurden. Sie werden dem Aufrufer zurückgegeben. Die nächsten beiden Parameter geben Adresse und Länge des Empfangspuffers an. Der letzte Parameter beschreibt Flags, die das Verhalten der recvfrom-Funktion steuern. Die möglichen Flags sind

  • MSG_PEEK
  • MSG_OOB

Sie haben dieselbe Bedeutung wie bei der Memberfunktion nRecv der Klasse StreamSocket.

Memberfunktion nRecvFrom

int nSendTo(unsigned long ulIPAdresse, 
            unsigned short usPort, 
            char *pchBuffer, 
            long lAnzahlBytes, 
            int nFlags = 0)

nSendTo sendet Daten an einen anderen Socket. Die Adressierung des Kommunikationspartners wird durch die ersten beiden Parameter durchgeführt. Die Daten müssen im Puffer stehen, auf den der dritte Parameter zeigt. Der vierte Parameter gibt die Anzahl der Bytes an, die übertragen werden sollen. Diese Anzahl darf nicht größer sein als die maximale UDP-Paketgröße, da UDP keine Reihenfolge der Daten gewährleistet und somit Übertragungen auf jeweils ein Paket beschränkt sind. Der letzte Parameter beschreibt das Verhalten der Funktion sendto. Die beiden möglichen Werte sind:

  • MSG_DONTROUTE
  • MSG_OOB

Die Bedeutung dieser Werte ist identisch mit denjenigen der Memberfunktion nSend der Klasse StreamSocket.

Memberfunktion nSendTo

int nSendTo(char *pszIPAdresse, 
            unsigned short usPort, 
            char *pchBuffer, 
            long lAnzahlBytes, 
            int nFlags = 0)

Der überladenen Memberfunktion nSendTo muß als erster Parameter die Internetadresse des Kommunikationspartners als Zeichenkette übergeben werden (10.10.10.100). Das Verhalten ist analog zu dem der anderen Memberfunktion.

Memberfunktion nSendTo





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 01:49:18 von textarchiv.alojado.de