11.16 Optionen für Sockets setzen bzw. erfragen
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.
11.16.1 setsockopt()
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.
11.16.2 getsockopt()
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().
11.16.3 Socket-Optionen
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.
|