setockopt-Funktion (winsock.h)

Die setockopt-Funktion legt eine Socketoption fest.

Syntax

int setsockopt(
  [in] SOCKET     s,
  [in] int        level,
  [in] int        optname,
  [in] const char *optval,
  [in] int        optlen
);

Parameter

[in] s

Ein Deskriptor, der einen Socket identifiziert.

[in] level

Die Ebene, auf der die Option definiert ist (z. B. SOL_SOCKET).

[in] optname

Die Socketoption, für die der Wert festgelegt werden soll (z. B. SO_BROADCAST). Der optname-Parameter muss eine Socketoption sein, die innerhalb der angegebenen Ebene definiert ist, oder das Verhalten ist nicht definiert.

[in] optval

Ein Zeiger auf den Puffer, in dem der Wert für die angeforderte Option angegeben wird.

[in] optlen

Die Größe des Puffers in Bytes, auf den der optval-Parameter verweist.

Rückgabewert

Wenn kein Fehler auftritt, gibt setsockopt null zurück. Andernfalls wird der Wert SOCKET_ERROR zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen von WSAGetLastError abgerufen werden.

Fehlercode Bedeutung
WSANOTINITIALISIERT
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen.
WSAENETDOWN
Beim Netzwerksubsystem ist ein Fehler aufgetreten.
WSAEFAULT
Der Puffer, auf den der optval-Parameter verweist, befindet sich nicht in einem gültigen Teil des Prozessadressraums, oder der optlen-Parameter ist zu klein.
WSAEINPROGRESS
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion.
WSAEINVAL
Der Levelparameter ist ungültig, oder die Informationen im Puffer, auf die der optval-Parameter verweist, sind ungültig.
WSAENETRESET
Die Verbindung hat ein Timeout, wenn SO_KEEPALIVE festgelegt ist.
WSAENOPROTOOPT
Die Option ist für den angegebenen Anbieter oder Socket unbekannt oder wird nicht unterstützt (siehe SO_GROUP_PRIORITY Einschränkungen).
WSAENOTCONN
Die Verbindung wurde zurückgesetzt, wenn SO_KEEPALIVE festgelegt wurde.
WSAENOTSOCK
Der Deskriptor ist kein Socket.

Hinweise

Die setockopt-Funktion legt den aktuellen Wert für eine Socketoption fest, die einem Socket eines beliebigen Typs in einem beliebigen Zustand zugeordnet ist. Obwohl Optionen auf mehreren Protokollebenen vorhanden sein können, sind sie immer auf der obersten Socketebene vorhanden. Optionen wirken sich auf Socketvorgänge aus, z. B. ob beschleunigte Daten (z. B. OOB-Daten) im normalen Datenstrom empfangen werden und ob Broadcastnachrichten auf dem Socket gesendet werden können.

Hinweis Wenn die setockopt-Funktion vor der Bindungsfunktion aufgerufen wird, werden TCP/IP-Optionen erst mithilfe von TCP/IP überprüft, wenn die Bindung erfolgt. In diesem Fall ist der Setockopt-Funktionsaufruf immer erfolgreich, aber der Aufruf der Bindungsfunktion kann aufgrund eines Fehlers eines frühen setockopt-Aufrufs fehlschlagen.
 
Hinweis Wenn ein Socket geöffnet wird, ein setockopt-Aufruf ausgeführt wird und dann ein sendto-Aufruf erfolgt, führt Windows Sockets einen impliziten Bindungsfunktionsaufruf aus.
 
Es gibt zwei Arten von Socketoptionen: Boolesche Optionen, die ein Feature oder Verhalten aktivieren oder deaktivieren, und Optionen, die einen ganzzahligen Wert oder eine Struktur erfordern. Um eine boolesche Option zu aktivieren, zeigt der optval-Parameter auf eine ganze Zahl ohne Zero. So deaktivieren Sie die Option Optval , zeigt auf eine ganze Zahl gleich 0. Der optlen-Parameter sollte für boolesche Optionen gleich sizeof(int) sein. Bei anderen Optionen zeigt optval auf eine ganze Zahl oder Struktur, die den gewünschten Wert für die Option enthält, und optlen ist die Länge der ganzzahligen Oder Struktur.

In den folgenden Tabellen sind einige der allgemeinen Optionen aufgeführt, die von der setockopt-Funktion unterstützt werden. Die Spalte Type gibt den Typ der daten an, die durch den optval-Parameter adressiert werden. Die Spalte Beschreibung enthält einige grundlegende Informationen zur Socketoption. Ausführlichere Listen der Socketoptionen und ausführlichere Informationen (z. B. Standardwerte) finden Sie in den ausführlichen Themen unter Socketoptionen.

Ebene = SOL_SOCKET

Wert type BESCHREIBUNG
SO_BROADCAST BOOL Konfiguriert einen Socket für das Senden von Broadcastdaten.
SO_CONDITIONAL_ACCEPT BOOL Ermöglicht, dass eingehende Verbindungen von der Anwendung und nicht vom Protokollstapel akzeptiert oder abgelehnt werden.
SO_DEBUG BOOL Aktiviert die Debugausgabe. Microsoft-Anbieter geben derzeit keine Debuginformationen aus.
SO_DONTLINGER BOOL Das Warten auf nicht gesendete Daten wird nicht blockiert. Das Festlegen dieser Option entspricht dem Festlegen SO_LINGER mit l_onoff auf Null festgelegt.
SO_DONTROUTE BOOL Legt fest, ob ausgehende Daten an die Schnittstelle gesendet werden sollen, an die der Socket gebunden ist, und nicht an eine andere Schnittstelle weitergeleitet werden sollen. Diese Option wird für ATM-Sockets nicht unterstützt (führt zu einem Fehler).
SO_GROUP_PRIORITY INT Reserviert.
SO_KEEPALIVE BOOL Ermöglicht das Senden von Keep-Alive-Paketen für eine Socketverbindung. Wird für ATM-Sockets nicht unterstützt (führt zu einem Fehler).
SO_LINGER VERWEILEN Bleibt geschlossen, wenn nicht gesendete Daten vorhanden sind.
SO_OOBINLINE BOOL Gibt an, dass out-of-bound-Daten inline mit regulären Daten zurückgegeben werden sollen. Diese Option gilt nur für verbindungsorientierte Protokolle, die Out-of-Band-Daten unterstützen. Eine Diskussion zu diesem Thema finden Sie unter Protokollunabhängige Out-Of-Band-Daten.
SO_RCVBUF INT Gibt den Gesamtpufferspeicher pro Socket an, der für Empfangsvorgänge reserviert ist.
SO_REUSEADDR BOOL Ermöglicht, dass der Socket an eine bereits verwendete Adresse gebunden wird. Weitere Informationen finden Sie unter binden. Gilt nicht für Atm-Sockets.
SO_EXCLUSIVEADDRUSE BOOL Ermöglicht das Binden eines Sockets für den exklusiven Zugriff. Erfordert keine Administratorrechte.
SO_RCVTIMEO DWORD Legt das Timeout in Millisekunden für das Blockieren von Empfangsanrufen fest.
SO_SNDBUF INT Gibt den Gesamtpufferspeicher pro Socket an, der für Sendevorgänge reserviert ist.
SO_SNDTIMEO DWORD Das Timeout in Millisekunden für das Blockieren von Sendeanrufen.
SO_UPDATE_ACCEPT_CONTEXT INT Updates den akzeptierenden Socket mit dem Kontext des abhörenden Sockets.
PVD_CONFIG Dienstanbieterabhängig Dieses Objekt speichert die Konfigurationsinformationen für den Dienstanbieter, der Sockets zugeordnet ist. Das genaue Format dieser Datenstruktur ist dienstanbieterspezifisch.
  Ausführlichere und ausführlichere Informationen zu Socketoptionen für SOL_SOCKET finden = Sie unter SOL_SOCKET Socketoptionen.

Ebene = IPPROTO_TCP

Weitere Informationen finden Sie unter TCP_NODELAY in IPPROTO_TCP Socketoptionen. Ausführlichere und ausführlichere Informationen zu Socketoptionen für IPPROTO_TCP = finden Sie auch indiesem Thema.

Ebene = NSPROTO_IPX

Wert type BESCHREIBUNG
IPX_PTYPE INT Legt den IPX-Pakettyp fest.
IPX_FILTERPTYPE INT Legt den Pakettyp des Empfangsfilters fest
IPX_STOPFILTERPTYPE INT Beendet das Filtern des Filtertypsatzes mit IPX_FILTERTYPE
IPX_DSTYPE INT Legt den Wert des Datenstromfelds im SPX-Header für jedes gesendete Paket fest.
IPX_EXTENDED_ADDRESS BOOL Legt fest, ob die erweiterte Adressierung aktiviert ist.
IPX_RECVHDR BOOL Legt fest, ob der Protokollheader für alle Empfangsheader gesendet wird.
IPX_RECEIVE_BROADCAST BOOL Gibt an, dass Broadcastpakete wahrscheinlich im Socket vorhanden sind. Legen Sie standardmäßig auf TRUE fest. Anwendungen, die keine Broadcasts verwenden, sollten dies auf FALSE festlegen, um die Systemleistung zu verbessern.
IPX_IMMEDIATESPXACK BOOL Weist SPX-Verbindungen an, vor dem Senden eines ACK nicht zu verzögern. Anwendungen ohne Hin- und Her-Datenverkehr sollten dies auf TRUE festlegen, um die Leistung zu erhöhen.
 

Ausführlichere und ausführlichere Informationen zu Socketoptionen für NSPROTO_IPX finden = Sie unter NSPROTO_IPX Socketoptionen.

BSD-Optionen, die für setsockopt nicht unterstützt werden, sind in der folgenden Tabelle aufgeführt.

Wert type BESCHREIBUNG
SO_ACCEPTCONN BOOL Gibt zurück, ob sich ein Socket im Abhörmodus befindet. Diese Option ist nur für verbindungsorientierte Protokolle gültig. Diese Socketoption wird für die Einstellung nicht unterstützt.
SO_RCVLOWAT INT Aus Gründen der Abwärtskompatibilität ist eine Socketoption von BSD UNIX enthalten. Mit dieser Option wird die Mindestanzahl von Bytes festgelegt, die für Socketeingabevorgänge verarbeitet werden sollen.
SO_SNDLOWAT INT Aus Gründen der Abwärtskompatibilität ist eine Socketoption von BSD UNIX enthalten. Mit dieser Option wird die Mindestanzahl von Bytes festgelegt, die für Socketausgabevorgänge verarbeitet werden sollen.
SO_TYPE INT Gibt den Sockettyp für den angegebenen Socket zurück (SOCK_STREAM oder SOCK_DGRAM, z. B. Diese Socketoption wird für die Einstellung des Sockettyps nicht unterstützt.
 
Hinweis Wenn Sie einen blockierenden Winsock-Aufruf wie setsockopt ausgeben, muss Winsock möglicherweise auf ein Netzwerkereignis warten, bevor der Anruf abgeschlossen werden kann. Winsock führt in dieser Situation eine warnbare Wartezeit aus, die durch einen asynchronen Prozeduraufruf (APC) unterbrochen werden kann, der für denselben Thread geplant ist. Das Ausgeben eines weiteren blockierenden Winsock-Aufrufs in einem APC, der einen fortlaufenden blockierenden Winsock-Aufruf im selben Thread unterbrochen hat, führt zu nicht definiertem Verhalten und darf niemals von Winsock-Clients versucht werden.
 

Beispielcode

Das folgende Beispiel veranschaulicht die setockopt-Funktion .
#ifndef UNICODE
#define UNICODE
#endif

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>

// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")

int main()
{

    //---------------------------------------
    // Declare variables
    WSADATA wsaData;

    SOCKET ListenSocket;
    sockaddr_in service;

    int iResult = 0;

    BOOL bOptVal = FALSE;
    int bOptLen = sizeof (BOOL);

    int iOptVal = 0;
    int iOptLen = sizeof (int);

    //---------------------------------------
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"Error at WSAStartup()\n");
        return 1;
    }
    //---------------------------------------
    // Create a listening socket
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %u\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //---------------------------------------
    // Bind the socket to the local IP address
    // and port 27015
    hostent *thisHost;
    char *ip;
    u_short port;
    port = 27015;
    thisHost = gethostbyname("");
    ip = inet_ntoa(*(struct in_addr *) *thisHost->h_addr_list);

    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr(ip);
    service.sin_port = htons(port);

    iResult = bind(ListenSocket, (SOCKADDR *) & service, sizeof (service));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"bind failed with error %u\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //---------------------------------------
    // Initialize variables and call setsockopt. 
    // The SO_KEEPALIVE parameter is a socket option 
    // that makes the socket send keepalive messages
    // on the session. The SO_KEEPALIVE socket option
    // requires a boolean value to be passed to the
    // setsockopt function. If TRUE, the socket is
    // configured to send keepalive messages, if FALSE
    // the socket configured to NOT send keepalive messages.
    // This section of code tests the setsockopt function
    // by checking the status of SO_KEEPALIVE on the socket
    // using the getsockopt function.

    bOptVal = TRUE;

    iResult = getsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &iOptVal, &iOptLen);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"getsockopt for SO_KEEPALIVE failed with error: %u\n", WSAGetLastError());
    } else
        wprintf(L"SO_KEEPALIVE Value: %ld\n", iOptVal);

    iResult = setsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &bOptVal, bOptLen);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"setsockopt for SO_KEEPALIVE failed with error: %u\n", WSAGetLastError());
    } else
        wprintf(L"Set SO_KEEPALIVE: ON\n");

    iResult = getsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &iOptVal, &iOptLen);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"getsockopt for SO_KEEPALIVE failed with error: %u\n", WSAGetLastError());
    } else
        wprintf(L"SO_KEEPALIVE Value: %ld\n", iOptVal);

    closesocket(ListenSocket);
    WSACleanup();
    return 0;
}


Hinweise zu IrDA-Sockets

Beachten Sie beim Entwickeln von Anwendungen, die Windows-Sockets für IrDA verwenden, Folgendes:

  • Die Af_irda.h-Headerdatei muss explizit enthalten sein.
  • IrDA bietet die folgende Socketoption:
    Wert type Bedeutung
    IRLMP_IAS_SET *IAS_SET Legt IAS-Attribute fest
     

Mit der IRLMP_IAS_SET Socketoption kann die Anwendung ein einzelnes Attribut einer einzelnen Klasse im lokalen IAS festlegen. Die Anwendung gibt die festzulegende Klasse, das Attribut und den Attributtyp an. Es wird erwartet, dass die Anwendung einen Puffer der erforderlichen Größe für die übergebenen Parameter ordnet.

IrDA stellt eine IAS-Datenbank bereit, in der IrDA-basierte Informationen gespeichert werden. Der eingeschränkte Zugriff auf die IAS-Datenbank ist über die Windows Sockets 2-Schnittstelle verfügbar, dieser Zugriff wird jedoch normalerweise nicht von Anwendungen verwendet und dient in erster Linie zur Unterstützung von Verbindungen mit Nicht-Windows-Geräten, die nicht mit den IrDA-Konventionen von Windows Sockets 2 kompatibel sind.

Die folgende Struktur , IAS_SET, wird mit der option IRLMP_IAS_SET setsockopt verwendet, um die lokale IAS-Datenbank zu verwalten:


// #include <Af_irda.h> for this struct

typedef struct _IAS_SET {
    u_char      irdaClassName[IAS_MAX_CLASSNAME];
    char      irdaAttribName[IAS_MAX_ATTRIBNAME];
    u_long    irdaAttribType;
    union
    {
              LONG irdaAttribInt;
              struct
              {
                   u_long   Len;
                   u_char    OctetSeq[IAS_MAX_OCTET_STRING];
              } irdaAttribOctetSeq;
              struct
              {
                   u_long    Len;
                   u_long    CharSet;
                   u_char    UsrStr[IAS_MAX_USER_STRING];
              } irdaAttribUsrStr;
    } irdaAttribute;
} IAS_SET, *PIAS_SET, FAR *LPIASSET;

Die folgende Struktur IAS_QUERY wird mit der option IRLMP_IAS_QUERY setsockopt verwendet, um die IAS-Datenbank eines Peers abzufragen:


// #include <Af_irda.h> for this struct

typedef struct _WINDOWS_IAS_QUERY {
        u_char   irdaDeviceID[4];
        char     irdaClassName[IAS_MAX_CLASSNAME];
        char     irdaAttribName[IAS_MAX_ATTRIBNAME];
        u_long   irdaAttribType;
        union
        {
                  LONG    irdaAttribInt;
                  struct
                  {
                          u_long  Len;
                          u_char  OctetSeq[IAS_MAX_OCTET_STRING];
                  } irdaAttribOctetSeq;
                  struct
                  {
                          u_long  Len;
                          u_long  CharSet;
                          u_char  UsrStr[IAS_MAX_USER_STRING];
                  } irdaAttribUsrStr;
        } irdaAttribute;
} IAS_QUERY, *PIAS_QUERY, FAR *LPIASQUERY;

Viele socket-Optionen auf SO_-Ebene sind für IrDA nicht sinnvoll. Nur SO_LINGER wird speziell unterstützt.

Windows Phone 8: Diese Funktion wird für Windows Phone Store-Apps auf Windows Phone 8 und höher unterstützt.

Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps unter Windows 8.1, Windows Server 2012 R2 und höher unterstützt.

Anforderungen

   
Unterstützte Mindestversion (Client) Windows 8.1, Windows Vista [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile winsock.h (Winsock2.h einschließen)
Bibliothek Ws2_32.lib
DLL Ws2_32.dll

Weitere Informationen

IPPROTO_IP Socketoptionen

IPPROTO_IPV6 Socketoptionen

IPPROTO_RM Socketoptionen

IPPROTO_TCP Socketoptionen

IPPROTO_UDP Socketoptionen

NSPROTO_IPX Socketoptionen

SOL_APPLETALK Socketoptionen

SOL_IRLMP Socketoptionen

SOL_SOCKET Socketoptionen

Socketoptionen

WSAAsyncSelect

WSAEventSelect

WSAIoctl

Winsock-Funktionen

bind

getsockopt

ioctlsocket

Socket