Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

soc_ioctl() (ioctl) - Sockets steuern

&pagelevel(4)&pagelevel



#include <sys.socket.h>
#include <ioctl.h>
#include <net.if.h>

Kernighan-Ritchie-C:
int soc_ioctl(s, request, argp);

int s;
unsigned long request;
char *argp;

ANSI-C:
int soc_ioctl(int s, unsigned long request, char* argp);


Beschreibung

Die Funktion soc_ioctl() führt Steuerfunktionen für Sockets aus.
s bezeichnet den Socket-Deskriptor.

Folgende Steuerfunktionen werden für Sockets in der Adressfamilie AF_INET unterstützt:

request

*argp

Funktion

FIONBIO

int

Blocking-Modus ein- und ausschalten

FIONREAD

int

Nachrichtenlänge im Puffer ermitteln

SIOCGIFCONF

struct ifconf

Interface-Konfiguration ermitteln

SIOCGIFADDR

struct ifreq

Internet-Adresse des Interface ermitteln

SIOCGIFBRDADDR

struct ifreq

Broadcast-Adresse des Interface ermitteln

SIOCGIFFLAGS

struct ifreq

Flags des Interface ermitteln

SIOCGIFNETMASK

struct ifreq

Netzmaske zum Interface ermitteln

SIOCGLIFADDR

struct lifreq

Interface-Adresse ermitteln

SIOCGLIFBRDADDR

struct lifreq

Broadcast-Adresse des Interface ermitteln

SIOCGLIFCONF

struct lifconf

Interface-Konfigurations-Liste ermitteln

SIOCGLIFFLAGS

struct lifreq

Interface-Flags ermitteln

SIOCGLIFHWADDR

struct lifreq

MAC-Adresse zum Interface ermitteln

SIOCGLIFINDEX

struct lifreq

Interface-Index ermitteln

SIOCGLIFNETMASK

struct lifreq

Netzmaske zum Interface ermitteln

SIOCGLIFNUM

struct lifnum

Anzahl Interfaces ermitteln

SIOCGLAHCONF

struct lvhost

Liste aller aktiven Hosts ausgeben

SIOCGLVHCONF

struct lvhost

Liste der aktiven virtuellen Hosts ausgeben

SIOCGLVHNUM

int

Anzahl der aktiven virtuellen Hosts ermitteln

Folgende Steuerfunktionen werden für Sockets in der Adressfamilie AF_INET6 unterstützt:

request

*argp

Funktion

FIONBIO

int

Blocking-Modus ein- und ausschalten

FIONREAD

int

Nachrichtenlänge im Puffer ermitteln

SIOCGLIFADDR

struct lifreq

Interface-Adresse ermitteln

SIOCGLIFBRDADDR

struct lifreq

Broadcast-Adresse des Interface ermitteln

SIOCGLIFCONF

struct lifconf

Interface-Konfigurations-Liste ausgeben

SIOCGLIFFLAGS

struct lifreq

Interface-Flags ermitteln

SIOCGLIFHWADDR

struct lifreq

MAC-Adresse zum Interface ausgeben

SIOCGLIFINDEX

struct lifreq

Interface-Index ermitteln

SIOCGLIFNETMASK

struct lifreq

Netzmaske zum Interface ermitteln

SIOCGLIFNUM

struct lifnum

Anzahl Interfaces ermitteln

SIOCGLAHCONF

struct lvhost

Liste aller aktiven Hosts ausgeben

SIOCGLVHCONF

struct lvhost

Liste der aktiven virtuellen Hosts ausgeben

SIOCGLVHNUM

int

Anzahl der aktiven virtuellen Hosts ermitteln

Folgende Steuerfunktion wird für Sockets in der Adressfamilie AF_ISO unterstützt:

request

*argp

Funktion

FIONBIO

int

Blocking-Modus ein- und ausschalten

Folgende Steuerfunktionen können ohne Socket (s = 0) genutzt werden:

request

*argp

Funktion

SIOCGBCPROC

struct ifproc

Liefert den BCAM-Prozessornamen zu einem FQDN zurück

SIOCGBCFQDN

struct ifproc

Liefert den FQDN zu einem BCAM-Prozessornamen zurück


FIONBIO

Diese Option beeinflusst das Ausführungsverhalten von Socket-Funktionen auf dem Socket s bei Datenflusskontrolle sowie bei noch nicht abgeschlossenen Aktionen des Kommunikationspartners:

  • *argp = 0:
    Socket-Funktionen blockieren, bis die Funktion ausgeführt werden kann.

  • *argp != 0:
    Socket-Funktionen kehren mit dem errno-Code EWOULDBLOCK zurück, wenn die Funktion nicht sofort ausgeführt werden kann. Mit select() oder soc_poll() kann festgestellt werden, welche Sockets zum Lesen oder Schreiben bereit sind. Standardfall: FIONBIO ist nicht gesetzt.

FIONREAD

Die Länge der aktuell im Eingangspuffer vorhandenen Nachricht (in Bytes) wird zurückgeliefert. 

SIOCGIFCONF

Es wird eine Ausgabeliste in Form von unverketteten Elementen vom Typ struct ifreq (siehe Option SIOCGIFADDR) erstellt. Den entsprechenden Speicherbereich für diese Liste stellt der Aufrufer bereit, indem er die Anfangsadresse und die Länge in die entsprechenden Felder der Struktur ifconf einträgt.
Es werden nur so viele Elemente vom Typ struct ifreq ausgegeben, wie in den zur Verfügung gestellten Puffer hineinpassen.
Diese Interfaces gehören zu einem Host. Im Normalfall ist das der Standardhost. Sind auch virtuelle Hosts konfiguriert, gibt es folgende Möglichkeiten, die entsprechenden Interfaces zu erhalten:

  • Ist die Anwendung unter einer Kennung gestartet, die durch einen Eintrag in der BCAM-Application-Tabelle auf einen virtuellen Host verlagert wird, dann wird die Information für diesen virtuellen Host ausgegeben.

  • Mit der setsockopt()-Subfunktion SO_VHOSTANY ist es möglich, vor dem Aufruf von soc_ioctl() auszuwählen, für welchen Host die Information ausgegeben werden soll.Die Struktur ifconf ist in <net.if.h> wie folgt deklariert:

    struct  ifconf {
            int             ifc_len;
            union {
                    caddr_t ifcu_buf;
                    struct  ifreq *ifcu_req;
            } ifc_ifcu;
    #define ifc_buf ifc_ifcu.ifcu_buf
    #define ifc_req ifc_ifcu.ifcu_req
    };
    

SIOCGIFADDR

Für das in der Struktur ifreq mit dem Interfacenamen ifr_name spezifizierte Interface wird die Internet-Adresse zurückgeliefert.

Die Struktur ifreq ist in <net.if.h> wie folgt deklariert:


struct ifreq {
#define IFNAMSIZ     16
   char ifr_name[IFNAMSIZ];      /* Interfacename z.B. IF000003" */
   union {

       struct sockaddr ifru_addr;
       struct sockaddr ifru_dstaddr;
       struct sockaddr ifru_broadaddr;
       short ifru_flags;
       int ifru_metric;
       caddr_t ifru_data; 
    } ifr_ifru;
#define ifr_addr      ifr_ifru.ifru_addr      /* Adresse */
#define ifr_dstaddr   ifr_ifru.ifru_dstaddr   /* Zieladr. d. Verbindung */
#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* Broadcast-Adresse */
#define ifr_flags     ifr_ifru.ifru_flags     /* Flags */
#define ifr_metric    ifr_ifru.ifru_metric    /* Metrik */
#define ifr_data      ifr_ifru.ifru_data      /* für die Schnittstelle */
};


Zu beachten ist, dass SOCKETS(BS2000) derzeit Informationen für nur ein Interface liefert. 

SIOCGIFBRDADDR

Für das in der Struktur ifreq (siehe Option SIOCGIFADDR) spezifizierte Interface wird die Broadcast-Adresse zurückgeliefert, wenn es sich um ein IPv4-Interface handelt und wenn das Flag IFF_BROADCAST gesetzt ist. Das ist normalerweise nicht der Fall, weil mit Sockets-Sprachmitteln und der Transportsystemunterstützung kein Broadcast erzeugt werden kann.

SIOCGIFFLAGS

Für den in der struct ifreq spezifizierten Interface-Namen werden die Interface-Flags im Element ifr_flags zurückgeliefert:

  • IFF_UP, wenn das Interface aktiv ist

  • IFF_BROADCAST, wenn über dieses Interface Broadcast-Nachrichten gesendet werden können

  • IFF_MULTICAST, wenn über dieses Interface Multicast-Nachrichten versendet werden können

  • IFF_LOOPBACK, wenn über dieses Interface Nachrichten an Loopback versendet werden können

  • IFF_CONTROLLAN, wenn über dieses Interface mit dem CONTROLLAN kommuniziert werden kann

SIOCGIFNETMASK

Für das in der Struktur ifreq spezifizierte IPv4-Interface wird im Element ifr_addr die Subnetmaske in der Form von auf „1“ gesetzten Bits des Netzanteils der Subnetmaske ausgegeben (z.B. „FFFFFF00“).

SIOCGLIFADDR

Für den in der Struktur lifreq spezifizierten Namen wird die Interface-Adresse zurückgegeben. Die Struktur lifreq ist eine besonders im Hinblick auf IPv6 erweiterte Struktur ifreq.

SIOCGLIFBRDADDR

Für das in der Struktur lfreq spezifizierte Interface wird die Broadcast-Adresse zurückgeliefert, wenn für dieses Interface das Flag IFF_BROADCAST gesetzt ist. Das ist normalerweise nicht der Fall, weil mit Sockets-Sprachmitteln und der Transportsystemunterstützung kein Broadcast erzeugt werden kann.
Für die Nutzung von MULTICAST gibt es eigene Subfunktionen unter getsockopt() / setsockopt() (siehe Abschnitt "getsockopt(), setsockopt() - Socket-Optionen abfragen und ändern").

SIOCGLIFCONF

Es wird eine Ausgabeliste in Form von unverketteten Elementen vom Typ struct lifreq erstellt. Den entsprechenden Speicherbereich für diese Liste stellt der Aufrufer bereit, indem er die Anfangsadresse und die Länge in die entsprechenden Felder der Struktur lifconf einträgt.
Es werden nur so viele Elemente vom Typ struct lifreq ausgegeben, wie in den zur Verfügung gestellten Puffer hineinpassen. Durch die Belegung der Elemente lifc_family und lifc_flags kann die Ausgabe gefiltert werden.
Werte für lifc_family: AF_INET, AF_INET6, AF_UNSPEC
Werte für lifc_flags: siehe SIOCGLIFFLAGS

Diese Interfaces gehören zu einem Host. Im Normalfall ist dies der Standardhost. Sind auch virtuelle Hosts konfiguriert, gibt es folgende Möglichkeiten, die entsprechenden Interfaces zu erhalten:

  • Ist die Anwendung unter einer Kennung gestartet, die durch einen Eintrag in der BCAM-Application-Tabelle auf einen virtuellen Host verlagert wird, dann wird die Information für diesen virtuellen Host ausgegeben.

  • Mit der setsockopt()-Subfunktion SO_VHOSTANY ist es möglich, vor dem Aufruf von soc_ioctl() auszuwählen, für welchen Host die Information ausgegeben werden soll.Die Struktur lifconf ist in <net.if.h> wie folgt deklariert:

    struct  lifconf {
            sa_family_t     lifc_family;
            int             lifc_flags;
            int             lifc_len;
            union {
                    caddr_t lifcu_buf;
                    struct  lifreq *lifcu_req;
            } lifc_lifcu;
    #define lifc_buf lifc_lifcu.lifcu_buf
    #define lifc_req lifc_lifcu.lifcu_req
    };
    

SIOCGLIFFLAGS

Für den in der Struktur lifreq spezifizierten Interface-Namen werden die Interface-Flags im Element lifr_flags zurückgeliefert:

  • IFF_UP, wenn das Interface aktiv ist

  • IFF_BROADCAST, wenn über dieses Interface Broadcast-Nachrichten gesendet werden können

  • IFF_MULTICAST, wenn über dieses Interface Multicast-Nachrichten versendet werden können

  • IFF_LOOPBACK, wenn über dieses Interface Nachrichten an Loopback versendet werden können

  • IFF_CONTROLLAN, wenn über dieses Interface mit dem CONTROLLAN kommuniziert werden kann

  • IFF_AUTOCONFIG, wenn dieses Interface mit einer durch IPv6-Autoconfig generierten Adresse versorgt wurde. Dazu gehört auch die lokal im Rechner erzeugt IPv6-Link-Local-Adresse mit dem Prefix FE80::/10.

SIOCGLIFHWADDR

Für den in der Struktur lifreq spezifizierten Interface-Namen wird die MAC-Adresse ausgegeben.

SIOCGLIFINDEX

Für den in der Struktur lifreq spezifizierten Interface-Namen wird der Index ausgegeben.

SIOCGLIFNETMASK

Für den in der Struktur lifreq angegebenen Interfacenamen lifr_name wird im Element lifr_addr die Subnetmaske und im Element lifr_addrlen die Prefixlänge in Bits ausgegeben. Handelt es sich um ein IPv4-Interface erfolgt die Ausgabe in der Form, dass alle betroffenen Bits des Netzanteils auf „1“ gesetzt sind (z.B. „FFFFFF00“). Handelt es sich um ein IPv6-Interface, wird der Netzanteil als Originaladresse ausgegeben und die folgenden Bits sind dann auf „0“ gesetzt (z.B. „FD11F052433485AA000000000000“).

SIOCGLIFNUM

Für die in der Struktur lifnum spezifizierte Adressfamilie wird die Anzahl der Interfaces ausgegeben.

SIOCGLAHCONF

Es wird eine nicht verkettete Liste mit Listenelementen vom Typ struct lvhost zurückgegeben. Diese enthalten den Socket-Hostnamen, den BCAM-Hostnamen, die Host-Nummer und ein Active-Flag vom realen Host und, falls vorhanden, auch von virtuellen Hosts. Der Speicher für diese Liste muss vom Anwender in *argp mit dem Typ struct lvhost übergeben werden. Die Länge ist im Feld lvhostlen einzutragen.
Wenn Informationen zu allen Hosts ausgegeben werden sollen, ist ein Speicher von n x sizeof(struct lvhost) erforderlich, wobei n der maximal möglichen Anzahl von aktiven Hosts entspricht.
Auf die Rückgabeinformation kann durch direkte Adressierung oder durch Indizierung zugegriffen werden. Im ersten Listen-Element wird im Feld vhostsum die Anzahl der zurückgegebenen Listen-Elemente vom Typ struct lvhost eingetragen. Im letzten Listen-Element wird das Feld vhostlast mit „1“ gekennzeichnet.

Ist der zur Verfügung gestellte Speicher nicht groß genug, wird im letzten Listen-Element das Feld vhostlast mit „-1“ gekennzeichnet.

SIOCGLVHCONF

Es wird eine nicht verkettete Liste mit Listenelementen vom Typ struct lvhost zurückgegeben, die im Unterschied zu SIOCGLAHCONF nur die Informationen über die virtuellen Hosts enthält.
Der Speicher für diese Liste muss vom Anwender in *argp mit dem Typ struct lvhost übergeben werden. Die Länge ist im Feld lvhostlen einzutragen. Wenn Informationen zu allen virtuellen Hosts ausgegeben werden sollen, ist ein Speicher von
n x sizeof(struct lvhost) erforderlich, wobei n dem Rückgabewert von SIOCGLVHNUM entspricht.
Auf die Rückgabeinformation kann durch direkte Adressierung oder durch Indizierung zugegriffen werden. Im ersten Listen-Element wird im Feld vhostsum die Anzahl der zurückgegebenen Listen-Elemente vom Typ struct lvhost eingetragen. Im letzten Listen-Element wird das Feld vhostlast mit „1“ gekennzeichnet.

Die Struktur lvhost ist in <net.if.h> wie folgt deklariert:


struct  lvhost { 
       int             lvhostlen;    /* length of memory for lvhostlist */
       unsigned short  vhostsum;     /* number of vhosts delivered      */
       unsigned short  vhostlast;    /* last element if not zero        */
       int             vhost_num;    /* vhost number, must be greater 1 */
       short           vhost_flag;   /* vhost active ?                  */
       char            vsockethost[33];  /* sockethostname of vhost     */
       char            vbcamhost[9]; /* bcamhostname of vhost           */
};


SIOCGLVHNUM

Die Anzahl der aktiven virtuellen Hosts wird zurückgegeben.

Die Struktur lifreq ist in <net.if.h> wie folgt deklariert:


struct  lifreq {
#define IFHWADDRLEN 6
#define LIFNAMSIZ 32
        char                             lifr_name[LIFNAMSIZ];
        union {
                int                      lifru_addrlen;
                unsigned int             lifru_ppa;
        } lifr_lifru1;
#define lifr_addrlen    lifr_lifru1.lifru_addrlen
#define lifr_ppa        lifr_lifru1.lifru_ppa
        unsigned int                     lifr_movetoindex;
        union {
                struct sockaddr_storage  lifru_addr;
                struct sockaddr_storage  lifru_dstaddr;

                struct sockaddr_storage  lifru_broadaddr;
                struct sockaddr_storage  lifru_token;
                struct sockaddr_storage  lifru_subnet;
                struct sockaddr          lifru_hwaddr;
                int                      lifru_index;
        union {
                unsigned int             lifru_flags_0,lifru_flags_1;
                u_int64_t                lifru_flags;
        } lifr_lifruflags;
                int                      lifru_metric;
                unsigned int             lifru_mtu;
                char                     lifru_data[1];
                char                     lifru_enaddr[6];
                int                      lif_muxid[2];
                struct lif_nd_req        lifru_nd_req;
                struct lif_ifinfo_req    lifru_ifinfo_req;
                char                     lifru_groupname[LIFNAMSIZ];
                unsigned int             lifru_delay;
        } lifr_lifru;
#define  lifr_addr       lifr_lifru.lifru_addr
#define  lifr_dstaddr    lifr_lifru.lifru_dstaddr
#define  lifr_broadaddr  lifr_lifru.lifru_broadaddr
#define  lifr_token      lifr_lifru.lifru_token
#define  lifr_subnet     lifr_lifru.lifru_subnet
#define  lifr_index      lifr_lifru.lifru_index
#define  lifr_flags      lifr_lifru.lifr_lifruflags.lifru_flags
#define  lifr_flags_l    lifr_lifru.lifr_lifruflags.lifru_flags_1
#define  lifr_flags_h    lifr_lifru.lifr_lifruflags.lifru_flags_0
#define  lifr_metric     lifr_lifru.lifru_metric
#define  lifr_mtu        lifr_lifru.lifru_mtu
#define  lifr_data       lifr_lifru.lifru_data
#define  lifr_enaddr     lifr_lifru.lifru_enaddr
#define  lifr_index      lifr_lifru.lifru_index
#define  lifr_ip_muxid   lifr_lifru.lif_muxid[0]
#define  lifr_nd         lifr_lifru.lifru_nd_req
#define  lifr_ifinfo     lifr_lifru.lifru_ifinfo_req
#define  lifr_groupname  lifr_lifru.lifru_groupname
#define  lifr_delay      lifr_lifru.lifru_delay
#define  lifr_hwaddr      lifr_lifru.lifru.lifru_hwaddr
};

Die Struktur sockaddr_storage ist in <sys.socket.h> wie folgt deklariert:

#define _SS_MAXSIZE     128         /* Implementation specific max size */
#define _PADSIZE        (_SS_MAXSIZE - (sizeof(u_int64_t) + 8 ))
struct sockaddr_storage {
        sa_family_t     ss_family;         /* address family */
#define __ss_family     ss_family
        char            res[6];            /* reserved for alignment */
        u_int64_t       addr;              /* address */
        char            pad[_PADSIZE];     /* pad up to max size */
};

Die Struktur lifnum ist in <net.if.h> wie folgt deklariert:

struct lifnum {
        sa_family_t     lifn_family;
        int             lifn_flags;
        int             lifn_count;
};


SIOCGBCPROC

Die Felder *fqdn und fqdnlen der Struktur ifproc müssen vom Aufrufer ausgefüllt werden. Für den Zeiger *fqdn muss ein char-Array bereitgestellt werden, welches den zu überprüfenden FQDN enthält. Die Länge dieses FQDN muss in das Feld fqdnlen eingetragen werden. Nach dem Aufruf der Funktion steht der zum FQDN (Fully Qualified Domain Name) zugehörige BCAM-Prozessorname in dem Feld bcproc[] mit String-Null-Terminierung (‘\0‘).
Sollte es zu diesem FQDN noch keinen BCAM-Prozessornamen geben, wird ein negativer Returncode zurückgeliefert. Das gilt auch dann, wenn zu dem angegebenen FQDN zwar ein bestimmter Prozessorname in der FQDN-Datei zugewiesen, der Prozessor/die Route aber nicht erzeugt wurde.
Eine IP-Adresse muss zwingend vorher in einen FQDN umgewandelt werden (siehe getnameinfo()-Funktion).
Der Socket-Deskriptor wird für diese Funktion nicht benötigt und ausgewertet.

Die Struktur ifproc ist in <net.if.h> wie folgt deklariert:

struct ifproc {
         char            *fqdn;     /* FQDN (Fully Qualified Domain Name) */
         int             fqdnlen;   /* length of the FQDN                 */
         char            bcproc[9]; /* space for BCAM processor name      */
};


SIOCGBCFQDN

Der Aufrufer muss für den Zeiger *fqdn ein char-Array bereitstellen und in fqdnlen die Länge dieses Arrays eintragen. Außerdem muss der BCAM-Prozessorname in dem Feld bcproc[] vermerkt werden. Nach dem Aufruf dieser Funktion steht der zum BCAM-Prozessornamen zugehörige FQDN (Fully Qualified Domain Name) mit String-Null-Terminierung (‘\0‘) in dem Feld, auf das der Zeiger *fqdn verweist. Sollte fqdnlen kleiner sein als die Länge des FQDN, gibt es einen Fehler und es wird kein FQDN eingetragen. Sollte der angegebene BCAM-Prozessorname nicht vorhanden sein oder es zu diesem Prozessornamen keinen FQDN geben, wird ebenfalls ein Fehler zurückgeliefert und zusätzlich die Länge 0 in fqdnlen eingetragen.

Der Socket-Deskriptor wird für diese Funktion nicht benötigt und ausgewertet.

Returnwert

-1:

bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.

Fehleranzeige durch errno

EBADF

Der Parameter s ist kein gültiger Deskriptor.

EINVAL

request oder arg sind für dieses Gerät (Interface, Socket) nicht gültig.