#include <sys.types.h>
#include <sys.socket.h>
#include <netinet.in.h> /* nur bei AF_INET oder AF_INET6 */
Kernighan-Ritchie-C:
int getsockopt(s, level, optname, optval, optlen);
int s;
int level;
int optname;
char *optval;
int *optlen;
int setsockopt(s, level, optname, optval, optlen);
int s;
int level;
int optname;
char *optval;
int optlen;
ANSI-C:
int getsockopt(int s, int level, int optname, char* optval, int* optlen);
int setsockopt(int s, int level, int optname, char* optval, int optlen);
Beschreibung
Mit der Funktion getsockopt() kann der Benutzer über die Parameter optname, optval und optlen die Eigenschaften (Optionen) der Socket-Schnittstelle oder eines einzelnen Sockets s abfragen.
Mit der Funktion setsockopt() kann der Benutzer über die Parameter optname, optval und optlen die Eigenschaften (Optionen) der Socket-Schnittstelle oder eines einzelnen Sockets s ändern.
Ob die Eigenschaften der Socket-Schnittstelle oder eines einzelnen Sockets abgefragt bzw. geändert werden sollen, bestimmt der Benutzer über den Parameter level.
Als aktueller Wert für level sind folgende Werte zulässig:
Diagnose-Ausgaben werden aktiviert.
Optionen des Sockets s der Adressfamilie AF_INET oder AF_INET6 werden abgefragt bzw. geändert.
Optionen des Sockets s der Adressfamilie AF_ISO werden abgefragt bzw. geändert.
Optionen des Sockets s in der Adressfamilie AF_INET oder AF_INET6 zur Modifikation des Protokollverhaltens des TCP-Protokolls werden abgefragt oder geändert.
Optionen des Sockets s in der Adressfamilie AF_INET zur Modifikation des Protokollverhaltens des IPv4-Protokolls werden abgefragt oder geändert. Aus Kompatibilitätsgründen wird IPPROTO_IP wie IPPROTO_IPV4 bewertet.
Optionen des Sockets s in der Adressfamilie AF_INET6 zur Modifikation des Protokollverhaltens des IPv6-Protokolls werden abgefragt oder geändert.
Optionen des Sockets s in der Adressfamilie AF_INET vom Typ SOCK_RAW zur Modifikation des Protokollverhaltens des IP-Protokolls im Zusammenhang mit dem ICMP-Protokoll werden abgefragt oder geändert.
Optionen des Sockets s in der Adressfamilie AF_INET6 vom Typ SOCK_RAW zur Modifikation des Protokollverhaltens des IPv6-Protokolls im Zusammenhang mit dem ICMPv6-Protokoll werden abgefragt oder geändert.
Bei level = IPPROTO_IPV4 und IPPROTO_IPV6 ist es vor dem Setzen mancher Optionen erforderlich, einen bind() auf den Socket zu machen.
Optionen für Level SOL_GLOBAL
Im Level SOL_GLOBAL hat der Operand s keine Bedeutung und sollte den Wert 0 erhalten.
Mit optname = SO_DEBUG können Diagnoseausgaben in unterschiedlicher Detailtiefe aktiviert werden.
Mit getsockopt() und optlen mit einem Wert von 4 (sizeof int) wird in optval der Wert des zur zeit eingestellten Diagnoseausgabe-Levels ausgegeben.
Mit dem Wert 0 ist die Diagnoseausgabe deaktiviert.
Mit setsockopt() und optlen mit einem Wert von 4 können in optval die in der Tabelle folgenden Diagnoseausgabe-Level festgelegt werden
*optval >= 1: Funktionsaufrufe | ||
*optval >= 6: Funktionsaufrufe | + Zusatzinformationen | |
*optval = 8: Funktionsaufrufe | + Zusatzinformationen | + BCAM-Parameterleiste nach Aufruf |
*optval = 9: Funktionsaufrufe | + Zusatzinformationen | + BCAM-Parameterleiste nach Aufruf |
Mit setsockopt() und optname = SO_ASYNC und optlen = 4 und optval mit einem Zeiger auf die Kurzkennung der Ereigniskennung der zu nutzenden externen Börse wird ein externer Wartepunkt für SOCKETS(BS2000) eingerichtet, wenn dies der erste Sockets-Aufruf des Subsystems ist (siehe Abschnitt "setsockopt() - Socket-Optionen ändern").
optname | *optlen | Wertebereich von optval |
SO_ASYNC | 4 | Zeiger auf Kurzkennung der Ereigniskennung (Event-ID) |
Optionen für Level SOL_SOCKET (AF_INET, AF_INET6)
In diesem Fall spezifiziert s den Socket, dessen Eigenschaften abgefragt bzw. geändert werden sollen. Für optname ist der Name der Option anzugeben, deren Wert abgefragt oder geändert werden soll.
Bei getsockopt() identifizieren optval und optlen jeweils einen Puffer, in dem der Wert der gewünschten Option(en) zurückgeliefert wird. *optlen enthält zu Beginn die Größe des Puffers, auf den optval zeigt. Bei Rückkehr der Funktion getsockopt() enthält *optlen die aktuelle Größe des zurückgelieferten Puffers. Hat die Option keinen Wert, der zurückgeliefert werden kann, so erhält *optval den Wert 0.
Bei getsockopt() können in der Adressfamilie AF_INET und AF_INET6 für optname und optlen folgende Werte zurückgeliefert werden:
optname | *optlen | Ausgabeformat von optval |
SO_DEBUG | 4 | int |
SO_DISHALIAS | 4 | int |
SO_ERROR | 4 | int |
SO_KEEPALIVE | 4 | int |
SO_LINGER | >= sizeof(struct linger) | *(struct linger) |
SO_OUTPUTBUFFER | 4 | int |
SO_RCVBUF | 4 | int |
SO_SNDBUF | 4 | int |
SO_TIMESTAMP | 4 | int |
SO_TSTIPAD | 4 | int |
SO_TYPE | 4 | int |
SO_VHOSTANY | 8 | *(char[8]) |
SO_KEEPALIVE
Ein Ausgabewert >0 gibt an, dass ein Timer-Wert mit setsockopt() eingestellt worden ist. Der Aufrufer kann den Verbindungsstatus für den gewählten Socket nicht erkennen. Ist die Verbindung aktiv, wird der Timerwert aus der Verbindungsinformation von BCAM ermittelt. Ist die Verbindung noch nicht aktiv, wird der Timerwert aus dem Socket ausgelesen.
Wird ein Timerwert = 0 ausgegeben, bedeutet dies nicht zwingend, dass KEEPALIVE ausgeschaltet ist! Eine globale Einstellung des KEEPALIVE-Timers durch die BCAM-Administration wird durch diese Funktion nicht sichtbar.
Bei setsockopt() ändern Sie über die Parameter optval und optlen Options-Werte. Dabei können Sie in den Adressfamilien AF_INET und AF_INET6 für optname, optlen und optval folgende Werte angeben:
optname | optlen | optval |
SO_BROADCAST (nur AF_INET) | 4 | |
SO_DEBUG | 4 | 0 |
SO_DISHALIAS | 4 | 0, 1 |
SO_KEEPALIVE | 4 | 0; 120...32767 |
SO_LINGER | >= sizeof(struct linger) | *(struct linger) |
SO_REUSEADDR | 4 | 0, 1 |
SO_TIMESTAMP | 4 | 0, 1 |
SO_VHOSTANY | 4 | *(char[9]) |
Der gültige Wertebereich von optval bei der Option SO_KEEPALIVE ist 0 und 120 ... 32767:
Mit dem Wert 0 wird der Timer ausgeschaltet.
Mit den Werten aus dem Bereich von 120 ... 32767 wird der Timer eingeschaltet und das Timer-Intervall mit dem angegebenen Wert (Einheit: Sekunden) eingestellt.
Bei Angabe eines Wertes außerhalb des gültigen Wertebereichs wird das Timer-Intervall mit dem Standardwert vom Transportsystem eingestellt.
SO_BROADCAST (nur AF_INET)
Diese Option hat für Sockets keine funktionelle Bedeutung. Es wird lediglich eine Syntaxprüfung durchgeführt.
Bei korrekter Syntax wird der Wert 0 zurückgeliefert, andernfalls der Wert -1.
SO_DEBUG
Bei level = SOL_GLOBAL legt diese Option den Diagnose-Level für die Sockets der aktiven Task fest.
Bei level = SOL_SOCKET hat die Option keine funktionale Bedeutung; es wird lediglich eine Syntaxprüfung durchgeführt.
Bei korrekter Syntax wird der Wert 0 zurückgeliefert, andernfalls der Wert -1.
SO_DISHALIAS
Mit dem Wert >0 wird im Socket eingetragen, dass mit dem bind()-Call für diese Anwendung das Host-Aliasing ausgeschaltet werden soll.
SO_ERROR
zeigt die Nummer des zuletzt ausgegebenen Fehlers an.
SO_KEEPALIVE
gibt an, ob für die aktuelle Verbindung die TCP-KEEPALIVE-Überwachung durchgeführt werden soll.
Im Einzelnen wird dabei spezifiziert,
ob in der TCP-Protokollmaschine für die aktuelle Verbindung die KEEPALIVE-Überwachung aktiviert werden soll und
welches Zeitintervall (in Sekunden) für diese Überwachung gewählt werden soll.
Die Wirkung von SO_KEEPALIVE hängt vom Status des zugehörigen Sockets ab:
Besteht für den Socket noch keine aktive Verbindung, dann wird der Wunsch nach KEEPALIVE-Überwachung mit dem zugehörigen Wert des Timer-Intervalls in der Socket-Struktur vermerkt und beim Verbindungsaufbau an das Transportsystem mit übergeben.
Bei einer Server-Anwendung, d.h. im Fall eines passiven Verbindungsaufbaus, muss der aktive listen()-Socket mit SO_KEEPALIVE bearbeitet werden, damit bei jedem Verbindungsaufbau die Überwachung automatisch eingeschaltet wird.
Besteht für den Socket bereits eine aktive Verbindung, dann wird die Information mithilfe eines internen Transportsystem-Aufrufs an die TCP-Protokollmaschine weitergereicht.
Mit dem Zeitintervall-Wert 0 wird die Überwachung deaktiviert:
Bei einer bestehenden Verbindung wird die Überwachung sofort deaktiviert.
Falls noch keine Verbindung besteht, wird die Überwachung beim Verbindungsaufbau deaktiviert. Im Server-Fall muss der listen()-Socket entsprechend markiert werden.
Aufgrund unterschiedlicher Implementierungen der TCP-Protokollmaschinen kann die Aufrechterhaltung der Verbindungen nicht garantiert werden (siehe auch RFC 1122).
SO_LINGER
Die Option SO_LINGER verwendet einen Parameter vom Datentyp struct linger. Dieser Parameter spezifiziert den gewünschten Status der Option und das Verzögerungsintervall.
Die Struktur linger ist in <sys.socket.h> definiert.
struct linger { int l_onoff; /* option on/off */ int l_linger; /* linger time */ };
Der Parameter l_linger legt die maximale Zeit für die Ausführung von soc_close() fest,mit l_onoff wird die „Linger“-Funktion aktiviert und deaktiviert (0 = OFF, >0 = ON). Mit getsockopt() werden der aktuelle Status der Option und das Verzögerungsintervall in Form einer Struktur linger zurückgeliefert.
SO_OUTPUTBUFFER
Anzeige der von der Socket-Schnittstelle akzeptierten, aber noch nicht vom Partner-Transportsystem quittierten Benutzerdaten.
SO_RCVBUF
zeigt die Größe des Eingabepuffers an.
SO_REUSEADDR
Die Option hat keine funktionale Bedeutung, wenn die Anwendung mit der SOCKETS(BS2000)-Version <= V2.1 produziert wurde oder auf BCAM < V18 trifft; es wird dann lediglich eine Syntaxprüfung durchgeführt.
Mit einer Produktion ab SOCKETS(BS2000) V.2.2 wird die Funktionalität von SO_REUSEADDR im Rahmen der Multihoming-Unterstützung benötigt. SO_REUSEADDR wirkt nur auf den angegebenen Socket und muss vor bind() gesetzt werden.
SO_REUSEADDR wird mit optval = 1 gesetzt und mit optval = 0 wieder zurückgesetzt.
Bei korrekter Syntax wird der Wert 0 zurückgeliefert, andernfalls der Wert -1.
SO_SNDBUF
zeigt die Größe des Ausgabepuffers an.
SO_TIMESTAMP
alle Pakete, die mit recvmsg() empfangen werden, erhalten einen Zeitstempel, der in einer Struktur cmsghdr abgespeichert wird. Im Datenbereich (wird über das Makro CMSG_DATA adressiert) dieser Struktur wird die Empfangszeit des Pakets in Form einer struct timeval angegeben.
Die Struktur timeval ist in <sys.time.h> definiert.
struct timeval { long tv_sec; /* seconds */ long tv_usec; /* and microseconds */ };
SO_TIMESTAMP wird mit optval = 1 aktiviert und mit optval = 0 wieder deaktiviert. Standardmäßig ist SO_TIMESTAMP deaktiviert.
Rückgabewert von optval:
0: Das Flag ist nicht gesetzt
1: Das Flag ist gesetzt
SO_TSTIPAD
vergleicht die übergebene IP-Adresse mit den Interface-Adressen des Socket-Hosts, auf dem die Socket-Anwendung läuft und teilt via optval das Vergleichsergebnis mit.
Die IP-Adresse wird mit dem Zeiger optval auf eine struct in_addr oder struct in6_addr als IPv4- oder IPv6-Adresse übergeben.
Der angegebene Socket muss nicht existieren. Es ist aber erforderlich, dass der File-Deskriptor im zulässigen Wertebereich liegt.
Der Wert des Parameters optlen spezifiziert, ob es sich um eine IPv4- oder IPv6-Adresse handelt. Somit muss der Wert von optlen je nach verwendetem Adresstyp der Länge von struct in_addr bzw. struct in6_addr entsprechen.
Als Rückgabewert werden die ersten 4 Byte der beim Aufruf übergebenen Adressstruktur überschrieben.
Rückgabewert von optval:
0: Die angegebene IP-Adresse ist eine eigene Interface-Adresse.
1: Die angegebene IP-Adresse ist keine eigene Interface-Adresse.
SO_TYPE
zeigt den Socket-Typ an.
SO_VHOSTANY
in der Zeichenfolge, auf die optval zeigt, wird der BCAM-Hostname des realen oder eines virtuellen Hosts angegeben, der dann im Socket eingetragen wird.
So ist es möglich, mit einer ANY- oder LOOPBACKADDR einen virtuellen Host zu adressieren, oder mit soc_ioctl(..., SIOCGLIFCONF,....) die Daten eines virtuellen Hosts auszulesen. Außerdem ist es möglich, auch einen realen Host zu adressieren, wenn unter einer Kennung gearbeitet wird, die durch einen Eintrag in der Application-Tabelle von BCAM einem virtuellen Host zugewiesen wurde.
Beim Lesen wird der im Socket eingetragene Name für den BCAM-Host ausgegeben.
BCAM-Hostname:
Er ist acht Zeichen lang. Es dürfen alphanumerische Zeichen und die Sonderzeichen #, @, $ oder Leerzeichen am Namensende verwendet werden. In der Regel sollten Großbuchstaben verwendet werden, es wird aber Groß-/Kleinschreibung unterschieden. Ein nur numerischer Anteil ist nicht erlaubt.
Optionen für Level IPPROTO_IPV4 (AF_INET)
Bei getsockopt() können Sie in der Adressfamilie AF_INET für optname und optlen folgende Werte angeben:
optname | *optlen | Ausgabeformat von optval |
IP_MTU_DISCOVER | 4 | int |
IP_MULTICAST_TTL | 4 | int |
IP_MULTICAST_IF | >= sizeof(struct in_addr) | *(struct in_addr) |
IP_MULTICAST_LOOP | 4 | int |
IP_OPTIONS | 8..40 | char* |
IP_RECVERR | 4 | int |
IP_RECVTTL | 4 | int |
IP_TTL | 4 | int |
Rückgabewert für IP_MTU_DISCOVER:
0: IP_PMTUDISC_DONT
2: IP_PMTUDISC_DO
Rückgabewert für IP_MULTICAST_TTL und IP_TTL:
Wert des eingestellten Hop-Limits.
Für die Option IP_MULTICAST_TTL ist ein vorheriger bind() notwendig.
Rückgabewert für IP_MULTICAST_IF:
IPv4-Adresse des Interfaces, über das gesendet werden soll.
Für diese Option muss zuerst ein bind() gemacht werden.
Rückgabewert für IP_MULTICAST_LOOP:
0: Loopback OFF
1: Loopback ON
Für diese Option muss zuerst ein bind() gemacht werden.
Rückgabewert für IP_OPTIONS:
Die vom Sender eingestellten Internet-Optionen werden in dem selben Format zurückgegeben, wie sie eingegeben wurden. Die übergebene Länge muss mindestens so groß sein, wie die Internet-Optionen.
Rückgabewert für IP_RECVERR und IP_RECVTTL:
0: Das Flag ist nicht gesetzt
1: Das Flag ist gesetzt
Bei setsockopt() ändern Sie Options-Werte über die Parameter optval() und optlen(). Dabei können Sie in der Adressfamilie AF_INET folgende Werte angeben:
optname | optlen | optval |
IP_ADD_MEMBERSHIP | >= sizeof(struct ip_mreq) | *(struct ip_mreq) |
IP_DROP_MEMBERSHIP | >= sizeof(struct ip_mreq) | *(struct ip_mreq) |
IP_MTU_DISCOVER | 4 | IP_PMTUDISC_DO IP_PMTUDISC_DONT |
IP_MULTICAST_TTL | 4 |
|
IP_MULTICAST_IF | >= sizeof(struct in_addr) | *(struct in_addr) |
IP_MULTICAST_LOOP | 4 | >= 0 |
IP_OPTIONS | <= 40 | char* |
IP_RECVERR | 4 | >= 0 |
IP_RECVTTL | 4 | 0, 1 |
IP_TTL | 4 | 1..255 |
Die Optionen IP_ADD_MEMBERSHIP und IP_DROP_MEMBERSHIP verwenden einen Parameter vom Datentyp struct ip_mreq. Dieser Parameter spezifiert die IPv4-Adresse der gewünschten Multicast-Gruppe und die lokale IPv4-Adresse.
Die Struktur ip_mreq ist in <netinet.in.h> definiert:
struct ip_mreq { struct in_addr imr_multiaddr; /* IP multicast address of group */ struct in_addr imr_interface; /* local IP address of interface */ };
IP_MULTICAST_TTL
zeigt oder setzt den Multicast-Hop-Limit.
Hop-Limit-Werte:
0: Senden nur innerhalb des lokalen Hosts (Loopback)
1: Senden innerhalb des lokalen Subnetzes
>1: Senden über Routergrenzen hinweg
IP_ADD_MEMBERSHIP
aktiviert die Zustellung von Nachrichten einer gewählten Multicast-Gruppe an diesen Socket. Angabe der Multicast- und der lokalen Interface-Adresse (IPv4-Adresse oder INADDR_ANY, nicht INADDR_LOOPBACK).
INADDR_ANY ist das Default-Interface von BCAM zum Empfang von Multicast-Daten.
Für diese Option muss zuerst ein bind() gemacht werden.
IP_DROP_MEMBERSHIP
deaktiviert die Zustellung von Nachrichten einer gewählten Multicast-Gruppe an diesen Socket. Angabe der Multicast- und der lokalen Interface-Adresse (IPv4-Adresse oder INADDR_ANY, nicht INADDR_LOOPBACK).
INADDR_ANY ist das Default-Interface von BCAM zum Empfang von Multicast-Daten.
Für diese Option muss zuerst ein bind() gemacht werden.
IP_MTU_DISCOVER
setzt das DF-Flag im IPv4-Protokoll-Header, das die Fragmentierung eines ICMP- oder UDP-Pakets zulässt oder verbietet.
IP_PMTUDISC_DONT | Fragmentieren erlaubt |
IP_PMTUDISC_DO | Fragmentieren soll verhindert werden |
IP_MULTICAST_IF
IPv4-Adresse des Interfaces, über das gesendet werden soll.
Für diese Option muss zuerst ein bind() gemacht werden.
IP_MULTICAST_LOOP
wird vom Sender der Nachrichten eingestellt und ermöglicht den Empfang auch auf dem lokalen, sendenden Host. 0: OFF, 1: ON (Default: ON)
Für diese Option muss zuerst ein bind() gemacht werden.
IP_OPTIONS
Internet-Optionen, die vom Sender der Nachrichten eingestellt werden. Der übergebene char-Pointer muss auf 4-Byte-Grenze ausgerichtet sein. Das genaue Format der Internet-Optionen kann im RFC791 in dem Kapitel 3.1 nachgelesen werden. Von Sockets werden derzeit nur Loose Source Route, Strict Source Route, Record Route und die Timestamp Option unterstützt.
IP_RECVERR
aktiviert die Zustellung von ICMP-Fehlermeldungen an diesen Socket, wenn die Option vor dem bind() gesetzt wurde. Bei Datagramm-Sockets und Raw-Sockets werden die Fehlermeldungen mit recvmsg() und dem Setzen des Flags MSG_ERRQUEUE abgeholt.
IP_RECVTTL
von jedem IPV4-Paket, das mit recvmsg() empfangen wird, wird das TTL-Feld ausgelesen und in einer Struktur cmsghdr gespeichert.
IP_RECVTTL wird mit optval = 1 aktiviert und mit optval = 0 wieder deaktiviert. Standardmäßig ist IP_RECVTTL deaktiviert.
IP_TTL
ändert das Hop-Limit im entsprechenden Feld des IP-Protokoll-Headers.
Optionen für Level IPPROTO_IPV6 (AF_INET6)
Bei getsockopt() können Sie in der Adressfamilie AF_INET6 für optname und optlen folgende Werte angeben:
optname | *optlen | Ausgabeformat von optval |
IPV6_HOPLIMIT | 4 | int |
IPV6_MTU_DISCOVER | 4 | int |
IPV6_MULTICAST_HOPS | 4 | int |
IPV6_MULTICAST_IF | 4 | int |
IPV6_MULTICAST_LOOP | 4 | int |
IPV6_RECVERR | 4 | int |
IPV6_RECVHOPLIMIT | 4 | int |
IPV6_UNICAST_HOPS | 4 | int |
IPV6_V6ONLY | 4 | int |
Rückgabewert für IPV6_MTU_DISCOVER:
0: IP_PMTUDISC_DONT
2: IP_PMTUDISC_DO
Rückgabewert für IPV6_MULTICAST_HOPS, IPV6_UNICAST_HOPS und IPV6_HOPLIMIT:
Wert des eingestellten Hop-Limits.
Für die Optionen IPV6_MULTICAST_HOPS und IPV6_UNICAST_HOPS ist ein vorheriger bind() notwendig.
Rückgabewert für IPV6_MULTICAST_IF:
Index des Sender-Interfaces.
Für diese Option muss zuerst ein bind() gemacht werden.
Rückgabewert für IPV6_MULTICAST_LOOP:
0: Loopback OFF
1: Loopback ON
Für diese Option muss zuerst ein bind() gemacht werden.
Rückgabewert für IPV6_RECVERR, IPV6_RECVHOPLIMIT und IPV6_V6ONLY:
0: Das Flag ist nicht gesetzt
1: Das Flag ist gesetzt
Bei setsockopt() können Sie in der Adressfamilie AF_INET6 für optname und optlen folgende Werte angeben:
optname | optlen | optval |
IPV6_JOIN_GROUP | >= sizeof(struct ipv6_mreq) | *(struct ipv6_mreq) |
IPV6_LEAVE_GROUP | >= sizeof(struct ipv6_mreq) | *(struct ipv6_mreq) |
IPV6_HOPLIMIT | 4 | 1..255 |
IPV6_MTU_DISCOVER | 4 | IP_PMTUDISC_DO IP_PMTUDISC_DONT |
IPV6_MULTICAST_HOPS | 4 | 0..255 |
IPV6_MULTICAST_IF | 4 | 1..255 |
IPV6_MULTICAST_LOOP | 4 | >= 0 |
IPV6_RECVERR | 4 | >= 0 |
IPV6_RECVHOPLIMIT | 4 | 0, 1 |
IPV6_UNICAST_HOPS | 4 | 0..255 |
IPV6_V6ONLY | 4 | >= 0 |
Die Optionen IPV6_JOIN_GROUP und IPV6_LEAVE_GROUP verwenden einen Parameter vom Datentyp struct ipv6_mreq. Dieser Parameter spezifiert die IPv6-Adresse der gewünschten Multicast-Gruppe und den Index des lokalen Interfaces.
Die Struktur ipv6_mreq ist in <netinet.in.h> definiert:
struct ipv6_mreq { struct in6_addr ipv6mr_multiaddr; /* IPv6 multicast addr */ int ipv6mr_interface; /* interface index */ };
IPV6_HOPLIMIT
ändert das Hop-Limit im entsprechenden Feld des IPv6-Protokoll-Headers.
IPV6_MULTICAST_HOPS
zeigt oder setzt den Multicast-Hop-Limit.
Für diese Option muss zuerst ein bind() gemacht werden.
Hop-Limit-Werte:
0: Senden nur innerhalb des lokalen Hosts (Loopback)
1: Senden innerhalb des lokalen Subnetzes
>1: Senden über Routergrenzen hinweg
IPV6_JOIN_GROUP
aktiviert die Zustellung von Nachrichten einer gewählten Multicast-Gruppe an diesen Socket. Angabe der IPv6-Multicastadresse und des Indexes der lokalen Interface-Adresse (Index für IPv6-Adresse oder Index 0, kein Index für Loopback).
Index 0 steht für das Default-Interface von BCAM zum Empfang von Multicast-Daten.
Für diese Option muss zuerst ein bind() gemacht werden.
IPV6_LEAVE_GROUP
deaktiviert die Zustellung von Nachrichten einer gewählten Multicast-Gruppe an diesen Socket. Angabe der IPv6-Multicastadresse und des Indexes der lokalen Interface-Adresse (Index für IPv6-Adresse oder Index 0, kein Index für Loopback).
Index 0 steht für das Default-Interface von BCAM zum Empfang von Multicast-Daten.
Für diese Option muss zuerst ein bind() gemacht werden.
IPV6_MTU_DISCOVER
IP_PMTUDISC_DONT | Fragmentieren erlaubt |
IP_PMTUDISC_DO | Fragmentieren soll verhindert werden |
Diese Funktion zeigt keine Wirkung, weil auf der IPv6-Protokollebene im Gegensatz zu IPv4 kein Flag vorgesehen ist, das die Fragmentierung verhindern könnte. Die Endsysteme sind nach der IPv6-Protokollvorschrift zum Fragmentieren verpflichtet.
IPV6_MULTICAST_IF
Index des IPv6-Interfaces, über das gesendet werden soll.
Für diese Option muss zuerst ein bind() gemacht werden.
IPV6_MULTICAST_LOOP
wird vom Sender der Nachrichten eingestellt und ermöglicht den Empfang auch auf dem lokalen sendenden Host. 0: OFF, 1: ON (Default: ON)
Für diese Option muss zuerst ein bind() gemacht werden.
IPV6_RECVERR
aktiviert die Zustellung von ICMP-Fehlermeldungen an diesen Socket, wenn die Option vor dem bind() gesetzt wurde. Bei Datagramm-Sockets und Raw-Sockets werden die Fehlermeldungen mit recvmsg() und dem Setzen des Flags MSG_ERRQUEUE abgeholt.
IPV6_RECVHOPLIMIT
von jedem IPV6-Paket, das mit recvmsg() empfangen wird, wird das Hop Limit-Feld ausgelesen und in einer Struktur cmsghdr gespeichert.
IPV6_RECVHOPLIMIT wird mit optval = 1 aktiviert und mit optval = 0 wieder deaktiviert. Standardmäßig ist IPV6_RECVHOPLIMIT deaktiviert.
IPV6_UNICAST_HOPS
setzt den Unicast-Hop-Limit.
Für diese Option muss zuerst ein bind() gemacht werden.
Hop-Limit-Werte:
0: Senden nur innerhalb des lokalen Hosts (Loopback)
1: Senden innerhalb des lokalen Subnetzes
>1: Senden über Routergrenzen hinweg
IPV6_V6ONLY
Mit der Option IPV6_V6ONLY ist es möglich, einen Socket auf die Nutzung von echten IPv6-Adressen zu beschränken (optval >=1), wenn es vor dem bind() im Socket gesetzt wird. Dadurch kann man eine Serveranwendung anbieten, die einen Listen-Socket in den Domänen AF_INET und AF_INET6 mit der gleichen Portnummer eröffnet.
Optionen für Level IPPROTO_TCP (AF_INET, AF_INET6)
Bei getsockopt() können Sie in den Adressfamilien AF_INET und AF_INET6 für optname und optlen folgende Werte angeben:
optname | *optlen | Ausgabeformat von optval |
SO_TCP_NODELAY | 4 | int |
Bei setsockopt() können Sie über die Parameter optval() und optlen() Option-Werte ändern. Dabei können Sie in den Adressfamilien AF_INET und AF_INET6 folgende Werte angeben:
optname | optlen | optval |
SO_TCP_NODELAY | 4 | 1 oder 0 (rücksetzen/setzen) |
TCP_DELAY | 4 | 1 oder 0 (rücksetzen/setzen) |
SO_TCP_NODELAY (TCP_NODELAY)
erlaubt das Abschalten des Nagle-Algorithmus des TCP-Protokolls. Wird diese Option im Socket (connect() oder listen()) gesetzt, wird die Aktion bei connect() oder dem Quittieren der Verbindung aktiviert.
Ist die Verbindung schon aufgebaut, wird diese Option sofort wirksam.
TCP_DELAY
Aus- oder Einschalten des Delayed-Ack-Timers einer Verbindung. Mit optval >0 werden die verzögerten Quittungen ausgeschaltet, mit optval = 0 werden sie wieder eingeschaltet.
Die Verbindung muss schon bestehen.
Optionen für Level IPPROTO_ICMP (AF_INET)
Bei setsockopt() können Sie über die Parameter optval() und optlen() Option-Werte ändern. Dabei können Sie in der Adressfamilie AF_INET folgende Werte angeben:
optname | optlen | optval |
IP_TTL | 4 | 1...255 |
IP_MTU_DISCOVER | 4 | IP_PMTUDISC_DO |
IP_TTL
ändert das Hop-Limit im entsprechenden Feld des IP-Protokoll-Headers des ICMP-Echo-Request-Pakets.
IP_MTU_DISCOVER
setzt das DF-Flag im IPv4-Protokoll-Header, das die Fragmentierung eines ICMP-Echo-Request-Pakets zulässt oder verbietet.
IP_PMTUDISC_DONT | Fragmentieren erlaubt |
IP_PMTUDISC_DO | Fragmentieren soll verhindert werden |
Optionen für Level IPPROTO_ICMPV6 (AF_INET6)
Bei setsockopt() können Sie über die Parameter optval() und optlen() Option-Werte ändern. Dabei können Sie in der Adressfamilie AF_INET6 folgende Werte angeben:
optname | optlen | Ausgabeformat in optval |
IPV6_HOPLIMIT | 4 | 1...255 |
IPV6_MTU_DISCOVER | 4 | IP_PMTUDISC_DO |
IPV6_HOPLIMIT
ändert das Hop-Limit im entsprechenden Feld des IPv6-Protokoll-Headers des ICMPv6-Echo-Request-Pakets.
IPV6_MTU_DISCOVER
IP_PMTUDISC_DONT | Fragmentieren erlaubt |
IP_PMTUDISC_DO | Fragmentieren soll verhindert werden |
Diese Funktion zeigt keine Wirkung, weil auf der IPv6-Protokollebene im Gegensatz zu IPv4 kein Flag vorgesehen ist, das die Fragmentierung verhindern könnte. Die Endsysteme sind nach der IPv6-Protokollvorschrift zum Fragmentieren verpflichtet.
Optionen für Level SOL_TRANSPORT (nur bei AF_ISO)
In diesem Fall spezifiziert s den Socket, dessen Eigenschaften abgefragt bzw. geändert werden sollen. Für optname ist der Name der Option anzugeben, deren Wert abgefragt oder geändert werden soll.
Bei getsockopt() identifizieren optval und optlen jeweils einen Puffer, in dem der Wert der gewünschten Option zurückgeliefert wird. *optlen enthält zu Beginn die Größe des Puffers, auf den optval zeigt. Bei Rückkehr der Funktion getsockopt() enthält *optlen die aktuelle Größe des zurückgelieferten Puffers. Hat die Option keinen Wert, der zurückgeliefert werden kann, so erhält *optval den Wert 0.
Bei getsockopt() können in der Adressfamilie AF_ISO für optname und *optlen folgende Werte zurückgeliefert werden:
optname | *optlen | Ausgabeformat in optval |
TPOPT_CONN_DATA | 0..33 | string inkl. Null-Byte |
TPOPT_CFRM_DATA | 0..33 | string inkl. Null-Byte |
TPOPT_DISC_DATA | 0..33 | string inkl. Null-Byte |
TPOPT_REDI_CALL | sizeof(struct cmsg_redhdr) | struct cmsg_redhdr |
In *optlen wird die tatsächliche Länge der Verbindungsdaten angegeben. Der Wertebereich von optlen beträgt 0..33, da die maximale Länge der Verbindungsdaten 32 byte beträgt.
Mit setsockopt() können in der Adressfamilie AF_ISO abhängig vom Socket-Status die Verbindungsdaten in den Socket geschrieben werden. Die nachfolgend beschriebenen Optionen sind auf der Socket-Ebene bekannt.
Beschreibung der Socket-Optionen im Fall AF_ISO:
TPOPT_CONN_DATA
Der Socket s ist erzeugt und hat mit bind() eine Adresse erhalten, aber connect() wurde noch nicht ausgeführt:
Mit TPOPT_CONN_DATA als aktuellem Parameterwert für optname können die Verbindungsdaten in den Socket s eingetragen werden, die beim Aufruf von connect() an den Partner gesendet werden sollen.
TPOPT_CFRM_DATA
Für den Socket s ist eine Verbindungsanforderung eingetroffen, die der Socket s noch nicht akzeptiert hat:
Mit TPOPT_CFRM_DATA als aktuellem Parameterwert für optname können die Verbindungsdaten in den Socket s eingetragen werden, die für das Akzeptieren der Verbindung an den Partner gesendet werden sollen (siehe auch Bild 4 im Abschnitt "Zusammenspiel der Funktionen bei verbindungsorientierter Kommunikation").
TPOPT_DISC_DATA
Die Verbindung zum Partner-Socket ist vollständig aufgebaut:
Mit TPOPT_DISC_DATA als aktuellem Parameterwert für optname können die Verbindungsdaten in den Socket s eingetragen werden, die beim soc_close() an den Partner gesendet werden sollen.
In optlen wird die tatsächliche Länge der Verbindungsdaten angegeben. Der Wertebereich von optlen beträgt 1..32, da die maximale Länge der Verbindungsdaten 32 byte beträgt und als Mindestlänge 1 byte geschrieben werden muss.
TPOPT_REDI_CALL
wird für die Handoff-Prozedur benötigt (siehe Kapitel „Erweiterte Funktionen von SOCKETS(BS2000)")
Returnwert
0:
bei Erfolg.
-1:
bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.
Fehleranzeige durch errno
ENOPROTOOPT
Die Option wird durch das Protokoll nicht unterstützt.
Für level, optname, optvalue oder optlen wurde ein ungültiger Wert spezifiziert.
ENOTSOCK
Der Deskriptor s verweist nicht auf einen Socket.
Siehe auch
socket()