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

 << zurück
Linux-UNIX-Programmierung von Jürgen Wolf
Das umfassende Handbuch – 2., aktualisierte und erweiterte Auflage 2006
Buch: Linux-UNIX-Programmierung

Linux-UNIX-Programmierung
1216 S., mit CD, 49,90 Euro
Rheinwerk Computing
ISBN 3-89842-749-8
gp Kapitel 11 Netzwerkprogrammierung
  gp 11.1 Einführung
  gp 11.2 Aufbau von Netzwerken
    gp 11.2.1 ISO/OSI und TCP/IP – Referenzmodell
    gp 11.2.2 Das World Wide Web (Internet)
  gp 11.3 TCP/IP – Aufbau und Struktur
    gp 11.3.1 Netzwerkschicht (Datenübertragung)
    gp 11.3.2 Internetschicht
    gp 11.3.3 Transportschicht (TCP, UDP)
    gp 11.3.4 Anwendungsschicht
  gp 11.4 TCP Socket
  gp 11.5 Kommunikationsmodell
  gp 11.6 Grundlegende Funktionen zum Zugriff auf die Socket-Schnittstelle
    gp 11.6.1 Ein Socket anlegen – socket()
    gp 11.6.2 Verbindungsaufbau – connect()
    gp 11.6.3 Socket mit einer Adresse verknüpfen – bind()
    gp 11.6.4 Auf Verbindungen warten – listen() und accept()
    gp 11.6.5 Senden und Empfangen von Daten (1) – write() und read()
    gp 11.6.6 Senden und Empfangen von Daten (2) – send() und recv()
    gp 11.6.7 Verbindung schließen – close()
  gp 11.7 Aufbau eines Clientprogramms
    gp 11.7.1 Zusammenfassung: Clientanwendung und Quellcode
  gp 11.8 Aufbau des Serverprogramms
    gp 11.8.1 Zusammenfassung: Serveranwendung und Quellcode
  gp 11.9 IP-Adressen konvertieren, manipulieren und extrahieren
    gp 11.9.1 inet_aton(), inet_pton() und inet_addr()
    gp 11.9.2 inet_ntoa() und inet_ntop()
    gp 11.9.3 inet_network()
    gp 11.9.4 inet_netof()
    gp 11.9.5 inet_lnaof()
    gp 11.9.6 inet_makeaddr()
  gp 11.10 Namen und IP-Adressen umwandeln
    gp 11.10.1 Name-Server
    gp 11.10.2 Informationen zum Rechner im Netz – gethostbyname und gethostbyaddr
    gp 11.10.3 Service-Informationen – getservbyname() und getservbyport()
  gp 11.11 Der Puffer
  gp 11.12 Standard-E/A-Funktionen verwenden
    gp 11.12.1 Pufferung von Standard-E/A-Funktionen
  gp 11.13 Parallele Server
  gp 11.14 Syncrones Multiplexing – select()
  gp 11.15 POSIX-Threads und Netzwerkprogrammierung
  gp 11.16 Optionen für Sockets setzen bzw. erfragen
    gp 11.16.1 setsockopt()
    gp 11.16.2 getsockopt()
    gp 11.16.3 Socket-Optionen
  gp 11.17 UDP
    gp 11.17.1 Clientanwendung
    gp 11.17.2 Serveranwendung
    gp 11.17.3 recvfrom() und sendto()
    gp 11.17.4 bind() verwenden oder weglassen
  gp 11.18 UNIX-Domain-Sockets (IPC)
    gp 11.18.1 Die Adressstruktur von UNIX-Domain-Sockets
    gp 11.18.2 Lokale Sockets erzeugen – socketpair()
  gp 11.19 Multicast-Socket
    gp 11.19.1 Anwendungsgebiete von Multicast-Verbindungen
  gp 11.20 Nicht blockierende I/O-Sockets
  gp 11.21 Etwas zu Streams und TLI, Raw Socket, XTI
    gp 11.21.1 Raw Socket
    gp 11.21.2 TLI und XTI
    gp 11.21.3 RPC (Remote Procedure Call)
  gp 11.22 IPv4 und IPv6
    gp 11.22.1 IPv6 – ein wenig genauer
  gp 11.23 Netzwerksoftware nach IPv6 portieren
    gp 11.23.1 Konstanten
    gp 11.23.2 Strukturen
    gp 11.23.3 Funktionen
  gp 11.24 Sicherheit und Verschlüsselung


Rheinwerk Computing

11.16 Optionen für Sockets setzen bzw. erfragen  downtop

Natürlich ist es auch möglich, das Verhalten von Sockets über Optionen zu verändern bzw. abzufragen. Eine Option setzen können Sie mit der Funktion setsockopt() und erfragen mit getsockopt(); wobei die Optionen zum Setzen bzw. Lesen zum Teil sehr unterschiedliche Datentypen besitzen. Einige Optionen erwarten nur einen binären Wert, womit eine Option gesetzt oder eben nicht gesetzt werden kann, andere Optionen hingegen erwarten ganze Strukturen als Optionswerte. Daher sind diese beiden Funktionen relativ flexibel und nicht an spezielle Werte bzw. Größen gebunden.


Rheinwerk Computing

11.16.1 setsockopt()  downtop

Zum Setzen von bestimmten Optionen steht Ihnen die Funktion setsockopt() zur Verfügung:

#include <sys/types.h>
#include <sys/socket.h>
int setsockopt( int s, int level, int optname, 
                const void *optval, socklen_t optlen );

Mit dieser Funktion setzen Sie Optionen für das Socket s.  Mit level geben Sie die Schicht der Paketverarbeitung an, auf die sich die Option beziehen soll. Als Schicht sind folgende Angaben möglich:

SOL_SOCKET, IPPROTO, IPPROTO_ICMPV6, IPPROTO_IPV6, IPROTO_TCP

Mit dem Parameter optname geben Sie die Option an, die gesetzt werden soll. Dazu finden Sie anschließend eine Tabelle mit allen vorhandenen Optionen. Der Parameter optval ist ein Zeiger auf eine Adresse, an ihm sind die Optionswerte gespeichert. optlen gibt an, wie groß der Optionsblock ist, der neu geschrieben werden soll.


Rheinwerk Computing

11.16.2 getsockopt()  downtop

Um die Optionen eines Sockets zu erfragen, steht die Funktion getsockopt() zur Auswahl:

#include <sys/types.h>
#include <sys/socket.h>
int getsockopt( int s, int level, int optname, 
                void *optval, socklen_t *optlen );

Die Bedeutung der einzelnen Parameter entspricht bis auf optlen exakt der von setsockopt(). optlen ist hierbei ein Zeiger auf eine Variable vom Typ socklen_t (was ein primitiver Datentyp für int ist) und liefert die Länge des Blocks zurück, der von getsockopt() in optval geschrieben wurde.

Beide Funktionen geben bei erfolgreicher Ausführung 0, ansonsten bei einem Fehler -1 zurück. Ein Beispiel zu dieser Funktion erspare ich mir vorerst, da die Funktionen im Laufe des Kapitels das eine oder andere Mal verwendet werden (und bereits verwendet wurden), insbesondere setsockopt().


Rheinwerk Computing

11.16.3 Socket-Optionen  toptop

Hierzu eine Auflistung aller Socket-Optionen, die Sie setzen oder erfragen können (ohne Anspruch auf Vollzähligkeit). In der ersten Spalte finden Sie die Optionen, die Sie für einen bestimmten Level verwenden können. Nach einer Kurzbeschreibung der Option finden Sie eine Markierung, ob die Option auf getsockopt() und/oder setsockopt() angewendet werden kann. In der letzten Spalte finden Sie den Datentyp, der für den vierten Parameter (optval) beider Funktionen unter Angabe der entsprechenden Option verwendet wird.

Level: SOL_SOCKET


Tabelle 11.6    Optionen für das Level SOL_SOCKET

Name Bedeutung get set Datentyp
SO_BROADCAST Senden von Broadcast-Datagrammen x x int
SO_DEBUG Debug-Tracing aktivieren x x int
SO_DONTROUTE Routing-Tabelle umgehen x x int
SO_ERROR Fehler aufnehmen und löschen x   int
SO_LINGER Beim Schließen warten, ob noch Daten kommen x x struct linger
SO_OOBINLINE Out-of-Band-Daten inline lassen x x size_t
SO_RCVBUF Empfangsgröße des Puffers x x size_t
SO_SNDBUF Größe des Puffers beim Senden x x int
SO_RCVTIMEO Empfangen eines Timeout x x struct timeval
SO_SNDTIMEO Senden eines Timeout x x struct timeval
SO_REUSEPORT Lokale Adresse wieder verwenden x x int
SO_REUSEADDR Lokale Adresse wieder verwenden x x int
SO_TYPE Socket-Type entgegennehmen x   int
SO_USELOOPBACK Routing-Socket nimmt eine Kopie dessen entgegen, was dieses verschickt hat. x x int
SO_KEEPALIVE Tests in bestimmten Zeitabständen, wenn die Verbindung noch aktiv ist. x x int


Hinweis   SO_REUSEPORT gibt es nicht für Linux (bzw. es ist als »to add« in Glibc und dem Kernel eingetragen. Siehe /usr/src/linux-2.6.4/include/asm/socket.h).


Level: IPPROTO_IP


Tabelle 11.7    Optionen für das Level IPPROTO_IP

Name Bedeutung get set Datentyp
IP_HDRINCL IP-Header mit Daten x x int
IP_OPTIONS IP-Header-Optionen x x  
IP_RECVDSTADDR Ziel-IP-Adresse wird zurückgegeben. x x int
IP_RECVIF Schnittstellenindex zurückgeben x x int
IP_TOS Type-of-Service x x int
IP_TTL Time-to-Live x x int


Hinweis   Mit IP_OPTIONS können Sie die IPv4-Header-IP-Optionen setzen bzw. abfragen. Allerdings müssen Sie sich hierbei näher mit den Quell-Routen-Optionen für IPv4 befassen, um diese Konstante und dessen Datentyp zu verwenden.


Level: IPPROTO_IP (Multicast)


Tabelle 11.8    Optionen für das Level IPPROTO_IP (Multicast)

Name Bedeutung get set Datentyp
IP_MULTICAST_IF Schnittstelle (ausgehend) angeben x x struct in_addr
IP_MULTICAST_TTL TTL (ausgehend) angeben x x u_char
IP_MULTICAST_LOOP Loopback angeben x x u_char
IP_ADD_MEMBERSHIP Beitreten einer Multicast-Gruppe   x struct ip_mreq
IP_DROP_MEMBERSHIP Verlassen einer Multicast-Gruppe   x struct ip_mreq

Level: IPPROTO_IPV6


Tabelle 11.9    Optionen für das Level IPPROTO_IPV6

Name Bedeutung get set Datentyp
IPV6_ADDRFORM Socket-Adressformat ändern x x int
IPV6_CHECKSUM Prüfsummenfeld (Offset) Raw Sockets x x int
IPV6_DSTOPTS Zieloptionen empfangen x x int
IPV6_HOPLIMIT Unicast-Hop-Limit empfangen x x int
IPV6_HOPOPTS Hop-by-Hop-Optionen empfangen x x int
IPV6_NEXTHOP Next-Hop-Adresse angeben x x struct sockaddr
IPV6_PKTINFO Paketinformationen empfangen x x int
IPV6_PKTOPTIONS Paketoptionen angeben x x  

Level: IPPROTO_IPV6 (Multicast)


Tabelle 11.10    Optionen für das Level IPPROTO_IPV6 (Multicast)

Name Bedeutung get set Datentyp
IPV6_MULTICAST_IF Schnittstelle (ausgehend) angeben x x struct in6_addr
IPV6_MULTICAST_HOPS Hops-Limit (ausgehend) angeben x x u_int
IPV6_MULTICAST_LOOP Loopback angeben x x u_int
IPV6_ADD_MEMBERSHIP Beitreten einer Multicast-Gruppe   x struct ipv6_mreq
IPV6_DROP_MEMBERSHIP Verlassen einer Multicast-Gruppe   x struct ipv6_mreq

Level: IPPROTO_TCP


Tabelle 11.11    Optionen für das Level IPPROTO_TCP

Name Bedeutung get set Datentyp
TCP_KEEPALIVE Sekunden zwischen Keep-alive x x int
TCP_MAXRT max. Wiederholungszeit d. Übertragung x x int
TCP_MAXSEG max. Segmentgröße x x int

Zugegeben, die Tabellen hätte ich mir auch ersparen können, da ein Blick auf die Manual Pages Ihnen selbiges und noch einige Optionen mehr gezeigt hätte. Des Weiteren werden für einige Leser viele dieser Optionen auch nach diesem Kapitel spanische Dörfer bleiben. Aber dennoch erschien es mir aus Referenzgründen wichtig, Ihnen einen Großteil dieser Optionen hier abzudrucken, auch wenn davon auf den kommenden Seiten kaum Gebrauch gemacht wird.

Grob gesehen, lassen sich diese Optionen in vier Kategorien einteilen: generische Socket-Optionen, IPv4-, IPv6- und TCP-Optionen.

In der Praxis werden allerdings am häufigsten die generischen Optionen SO_KEEPALIVE, SO_RCVBUF, SO_SNDBUF und SO_REUSEADDR verwendet. Daneben wird für Broadcasting und Multicast-Anwendungen häufig gerne die Option SO_BROADCAST eingesetzt. Die generischen Optionen (alle, die mit SO_ beginnen) werden sehr gut in den Manual Pages von getsockopt() und setsockopt() beschrieben.

 << zurück
  
  Zum Rheinwerk-Shop
Neuauflage: Linux-UNIX-Programmierung
Neuauflage:
Linux-UNIX-
Programmierung

bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-
 Programmierung


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
Info





Copyright © Rheinwerk Verlag GmbH 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.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern