Freigeben über


setsockopt-Funktion (winsock.h)

Die Setsockopt-Funktion legt eine Socketoption fest.

Syntax

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

Die 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 ein Wert von 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
Fehler des Netzwerksubsystems.
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 durch den Optval-Parameter verwiesen wird, sind ungültig.
WSAENETRESET
Die Verbindung ist beim Festlegen SO_KEEPALIVE timeout.
WSAENOPROTOOPT
Die Option ist für den angegebenen Anbieter oder Socket unbekannt oder nicht unterstützt (siehe SO_GROUP_PRIORITY Einschränkungen).
WSAENOTCONN
Die Verbindung wurde zurückgesetzt, wenn SO_KEEPALIVE festgelegt ist.
WSAENOTSOCK
Der Deskriptor ist kein Socket.

Bemerkungen

Die Setsockopt-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 Übertragungsnachrichten im Socket gesendet werden können.

Anmerkung Wenn die Setockopt-Funktion vor der Bindungsfunktion aufgerufen wird, werden TCP/IP-Optionen erst dann mithilfe von TCP/IP überprüft, wenn die Bindung erfolgt. In diesem Fall ist der Setockopt-Funktionsaufruf immer erfolgreich, aber der Bind-Funktionsaufruf kann aufgrund eines frühen Setockopt-Aufrufs fehlschlagen.
 
Anmerkung Wenn ein Socket geöffnet wird, wird ein Setockopt-Aufruf ausgeführt, und dann wird ein Sendto-Aufruf ausgeführt, Windows Sockets führt 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 ganze Struktur erfordern. Um eine boolesche Option zu aktivieren, zeigt der Optval-Parameter auf eine ganzzahlige Nullzahl.To enable a Boolean option, the optval parameter points to a nonzero integer. Um die Option optval zu deaktivieren, zeigt sie auf eine ganze Zahl gleich Null. 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 ganzen Zahl oder Struktur.

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

Niveau = SOL_SOCKET

Wert Typ Description
SO_BROADCAST BOOL Konfiguriert einen Socket zum Senden von Übertragungsdaten.
SO_CONDITIONAL_ACCEPT BOOL Ermöglicht, dass eingehende Verbindungen von der Anwendung akzeptiert oder abgelehnt werden, nicht vom Protokollstapel.
SO_DEBUG BOOL Aktiviert die Debugausgabe. Microsoft-Anbieter geben derzeit keine Debuginformationen aus.
SO_DONTLINGER BOOL Sperrt das Schließen nicht, bis nicht gesendete Daten gesendet werden. Das Festlegen dieser Option entspricht dem Festlegen SO_LINGER mit l_onoff auf Null festgelegt.
SO_DONTROUTE BOOL Legt fest, ob ausgehende Daten über die Schnittstelle gesendet werden sollen, an die der Socket gebunden ist und nicht an eine andere Schnittstelle weitergeleitet wird. 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 beim Schließen, wenn nicht gesendete Daten vorhanden sind.
SO_OOBINLINE BOOL Gibt an, dass out-of-bound-Daten in Zeile mit regulären Daten zurückgegeben werden sollen. Diese Option ist nur für verbindungsorientierte Protokolle gültig, 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 gesamt reservierten Pufferraum pro Socket an.
SO_REUSEADDR BOOL Ermöglicht die Bindung des Sockets an eine adresse, die bereits verwendet wird. Weitere Informationen finden Sie unter bind. Gilt nicht für ATM-Sockets.
SO_EXCLUSIVEADDRUSE BOOL Ermöglicht die Bindung eines Sockets für 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 Gesamtspeicher pro Socketpuffer an, der für Sendesendungen reserviert ist.
SO_SNDTIMEO DWORD Das Timeout in Millisekunden zum Blockieren von Sendeanrufen.
SO_UPDATE_ACCEPT_CONTEXT UINT_PTR Aktualisiert den akzeptierenden Socket mit dem Kontext des Überwachungssockets.
PVD_CONFIG Vom Dienstanbieter abhä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 ebene = finden Sie unter SOL_SOCKET Socketoptionen.

Niveau = IPPROTO_TCP

Siehe TCP_NODELAY in IPPROTO_TCP Socketoptionen. Lesen Sie auch dieses Thema, um ausführlichere und ausführlichere Informationen zu Socketoptionen für level = IPPROTO_TCP zu finden.

Niveau = NSPROTO_IPX

Wert Typ Description
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 Übertragungspakete wahrscheinlich im Socket vorhanden sind. Standardmäßig auf TRUE festgelegt. Anwendungen, die keine Übertragungen verwenden, sollten dies auf FALSE festlegen, um eine bessere Systemleistung zu erzielen.
IPX_IMMEDIATESPXACK BOOL Directs SPX connections not to delay before sending an ACK. Anwendungen ohne Back-and-Forth-Datenverkehr sollten dies auf TRUE festlegen, um die Leistung zu erhöhen.
 

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

Die BSD-Optionen für Setsockopt werden in der folgenden Tabelle nicht unterstützt.

Wert Typ Description
SO_ACCEPTCONN BOOL Gibt zurück, ob sich ein Socket im Überwachungsmodus befindet. Diese Option ist nur für verbindungsorientierte Protokolle gültig. Diese Socketoption wird für die Einstellung nicht unterstützt.
SO_RCVLOWAT INT Eine Socketoption von BSD UNIX ist aus Gründen der Abwärtskompatibilität enthalten. Diese Option legt die Mindestanzahl der Bytes fest, die für Socketeingabevorgänge verarbeitet werden sollen.
SO_SNDLOWAT INT Eine Socketoption von BSD UNIX ist aus Gründen der Abwärtskompatibilität enthalten. Diese Option legt die Mindestanzahl der Bytes fest, 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.
 
Anmerkung Beim Ausgeben eines blockierten Winsock-Aufrufs wie "setsockopt" muss Winsock möglicherweise auf ein Netzwerkereignis warten, bevor der Aufruf abgeschlossen werden kann. Winsock führt in dieser Situation eine warnbare Wartezeit durch, die durch einen asynchronen Prozeduraufruf (APC) unterbrochen werden kann, der im selben Thread geplant ist. Das Ausstellen eines weiteren blockierenden Winsock-Aufrufs innerhalb eines APC, der einen fortlaufend blockierten 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 Setsockopt-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 für IrDA-Sockets

Beachten Sie beim Entwickeln von Anwendungen mit Windows-Sockets für IrDA Folgendes:

  • Die Headerdatei Af_irda.h muss explizit eingeschlossen werden.
  • IrDA bietet die folgende Socketoption:
    Wert Typ 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 zuweist.

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, aber dieser Zugriff wird normalerweise nicht von Anwendungen verwendet und besteht in erster Linie zur Unterstützung von Verbindungen mit Nicht-Windows-Geräten, die nicht den IrDA-Konventionen von Windows Sockets 2 entsprechen.

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 SO_ Socketoptionen auf 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 unter 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

Anforderung Wert
Mindestens unterstützter Client Windows 8.1, Windows Vista [Desktop-Apps | UWP-Apps]
mindestens unterstützte Server- Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform- Fenster
Header winsock.h (include Winsock2.h)
Library Ws2_32.lib
DLL Ws2_32.dll

Siehe auch

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

binden

getsockopt

ioctlsocket

Steckdose