SO _ CONDITIONAL _ ACCEPT-Socketoption

Die Socketoption SO _ CONDITIONAL _ ACCEPT ist so konzipiert, dass eine Anwendung entscheiden kann, ob eine eingehende Verbindung für einen lauschenden Socket akzeptiert werden soll.

Wert der Socketoption

Die Konstante, die diese Socketoption darstellt, ist 0x3002.

Syntax

int setsockopt(
  (SOCKET) s,      // descriptor identifying a socket 
  (int) SOL_SOCKET,   // level
  (int) SO_CONDITIONAL_ACCEPT, // optname
  (char *) optval,         // input buffer,
  (int) optlen,       // size of input buffer
);

Parameter

s [ in]

Ein Deskriptor, der den Socket identifiziert.

-Ebene [ In]

Die Ebene, auf der die Option definiert ist. Verwenden Sie SOL _ SOCKET für diesen Vorgang.

optname [ In]

Die Socketoption, für die der Wert festgelegt werden soll. Verwenden Sie SO _ CONDITIONAL _ ACCEPT für diesen Vorgang.

optval [ out]

Ein Zeiger auf den Puffer, der den Wert für die festzulegende Option enthält. Dieser Parameter sollte auf einen Puffer zeigen, der gleich oder größer als die Größe eines DWORD-Werts ist.

Dieser Wert wird als boolescher Wert behandelt, wobei 0 zum Angeben von FALSE (deaktiviert) und ein Wert ungleich 0 (null) verwendet wird, um TRUE (aktiviert) anzugeben.

optlen [ in, out]

Ein Zeiger auf die Größe des optval-Puffers in Bytes. Diese Größe muss gleich oder größer als die Größe eines DWORD-Werts sein.

Rückgabewert

Wenn der Vorgang erfolgreich abgeschlossen wurde, gibt setsockopt 0 (null) zurück.

Wenn der Vorgang fehlschlägt, wird der Wert SOCKET _ ERROR zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen von WSAGetLastErrorabgerufen werden.

Fehlercode Bedeutung
WSANOTINITIALISED
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen.
WSAENETDOWN
Fehler beim Netzwerksubsystem.
WSAEFAULT
Einer der optval- oder optlen-Parameter verweist auf den Arbeitsspeicher, der sich nicht in einem gültigen Teil des Benutzeradressraums befindet. Dieser Fehler wird auch zurückgegeben, wenn der Wert, auf den der optlen-Parameter zeigt, kleiner als die Größe eines DWORD-Werts ist.
WSAEINPROGRESS
Eine blockierende Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion.
WSAEINVAL
Der level-Parameter ist unbekannt oder ungültig. Dieser Fehler wird auch zurückgegeben, wenn sich der Socket bereits im Überwachungszustand befand.
WSAENOPROTOOPT
Die Option ist unbekannt oder wird von der angegebenen Protokollfamilie nicht unterstützt.
WSAENOTSOCK
Der Deskriptor ist kein Socket.

Bemerkungen

Mit der setockopt-Funktion, die mit der Socketoption SO CONDITIONAL _ _ ACCEPT aufgerufen wird, kann eine Anwendung entscheiden, ob eine eingehende Verbindung für einen lauschenden Socket akzeptiert werden soll. Die bedingte Annahmeoption für einen Socket ist standardmäßig deaktiviert (auf FALSE festgelegt).

Wenn diese Socketoption aktiviert ist, akzeptiert der TCP-Stapel nicht automatisch Verbindungen. Es wartet, bis die Anwendung angibt, dass sie die Verbindung über den rückruf für bedingten Accept akzeptiert, der bei der WSAAccept-Funktion registriert ist. Sobald eine Verbindungsanforderung empfangen wurde, ruft Winsock den von der Anwendung registrierten Rückruf zur bedingten Annahme auf. Nur wenn der bedingte Accept-Rückruf CF _ ACCEPT zurückgibt, benachrichtigt Winsock den Transport, um die Verbindung vollständig zu akzeptieren.

Wenn die Socketoption SO _ CONDITIONAL _ ACCEPT auf aktiviert festgelegt ist (auf TRUE festgelegt), hat dies mehrere Nebeneffekte für den Socket:

  • Dadurch werden die integrierten Syn-Angriffsschutzmaßnahmen des TCP-Stapels deaktiviert, da die Anwendung nun den Besitz der Annahme von Verbindungen übernimmt.
  • Dadurch wird das Lauschenbacklog effektiv deaktiviert, da Verbindungen im Namen eines lauschenden Sockets nicht akzeptiert werden. Eine Verbindung wird nie vollständig akzeptiert, bis die Anwendung die Verwendung des CF _ ACCEPT-Mechanismus vollständig akzeptiert.
  • Dies bedeutet auch, dass die Anwendung darauf achten muss, dass sie sich immer in einem Zustand befindet, um die Accept-Rückrufe zur Annahme der Verbindung problemlos zu verarbeiten. Wenn die Anwendung mit einer anderen Verarbeitung ausgelastet ist, kann für die Clientseite ein Time out auftreten, bevor die Anwendung die Verbindung tatsächlich akzeptiert. Dies führt zu einer schlechten Clienterfahrung.

Im Allgemeinen ist der Hauptgrund, warum Anwendungen bedingtes Akzeptieren verwenden, die Quell-IP-Adresse oder den Port zu überprüfen, die bzw. der vom Verbindungsclient verwendet wird, und dann die Verbindung zu akzeptieren oder abzulehnen. Anwendungen werden jedoch wahrscheinlich besser funktionieren, wenn die Option SO _ CONDITIONAL ACCEPT nicht aktiviert ist und die Anwendung _ zulässt, dass der TCP-Stapel und das Lauschenbacklog erwartungsgemäß funktionieren. Wenn die Anwendung dann die akzeptierte Verbindung verarbeitet, kann die Anwendung den Socket einfach schließen, wenn sie von einer nicht ordnungsgemäßen IP-Quelladresse oder einem falschen Port stammt. Der Sicherheitsnachteil dieses Verhaltens besteht darin, dass der Client nun bestätigt, dass die Anwendung an einer IP-Adresse und einem Port lauscht, da die zuvor akzeptierte Verbindung geschlossen wurde. Die Nachteile der Aktivierung von SO _ CONDITIONAL _ ACCEPT überwiegen diese Einschränkung jedoch im Allgemeinen.

Die getsockopt-Funktion, die mit der Socketoption SO CONDITIONAL _ _ ACCEPT aufgerufen wird, ermöglicht einer Anwendung das Abrufen des aktuellen Zustands der Bedingten Annahmeoption, obwohl diese Funktion normalerweise nicht verwendet wird. Wenn eine Anwendung die bedingte Annahme für einen Socket aktivieren muss, ruft sie nur die setsockopt-Funktion auf, um die Option zu aktivieren.

Beachten Sie, dass die Headerdatei Ws2def.h automatisch in Winsock2.h enthalten ist und niemals direkt verwendet werden sollte.

Requirements (Anforderungen)

Anforderung Wert
Unterstützte Mindestversion (Client)
Windows [Nur Vista-Desktop-Apps]
Unterstützte Mindestversion (Server)
Windows Nur Server [ 2008-Desktop-Apps]
Header
Ws2def.h (einschließlich Winsock2.h)

Weitere Informationen

getsockopt

setsockopt

WSAAccept