Freigeben über


SO_CONDITIONAL_ACCEPT Socketoption

Die SO_CONDITIONAL_ACCEPT Socketoption ist so konzipiert, dass eine Anwendung entscheiden kann, ob eine eingehende Verbindung in einem Überwachungssocket akzeptiert werden soll.

Socketoptionswert

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
);

Die 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 den Puffer verweisen, der gleich oder größer als die Größe eines DWORD-Werts ist.

Dieser Wert wird als boolescher Wert mit 0 behandelt, der verwendet wird, um FALSCH (deaktiviert) und einen Wert ungleich Null anzugeben, der WAHR (aktiviert) angibt.

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 ist, gibt setsockopt null zurück.

Wenn der Vorgang fehlschlägt, 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
Einer der Optval - oder optlen-Parameter verweist auf den Speicher, 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 verweist, kleiner als die Größe eines DWORD-Werts ist.
WSAEINPROGRESS
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion.
WSAEINVAL
Der Levelparameter ist unbekannt oder ungültig. Dieser Fehler wird auch zurückgegeben, wenn sich der Socket bereits in einem Überwachungszustand befand.
WSAENOPROTOOPT
Die Option ist unbekannt oder wird von der angegebenen Protokollfamilie nicht unterstützt.
WSAENOTSOCK
Der Deskriptor ist kein Socket.

 

Bemerkungen

Die setockopt-Funktion , die mit der Option SO_CONDITIONAL_ACCEPT Socket aufgerufen wird, ermöglicht einer Anwendung zu entscheiden, ob eine eingehende Verbindung in einem Überwachungssocket akzeptiert werden soll. Die Option für die bedingte Annahme für einen Socket ist standardmäßig deaktiviert (auf FALSE festgelegt).

Wenn diese Socketoption aktiviert ist, akzeptiert der TCP-Stapel keine automatischen Verbindungen. Es wartet darauf, dass die Anwendung darauf hinweist, dass sie die Verbindung über den mit der WSAAccept-Funktion registrierten Rückruf der bedingten Annahme akzeptiert. Sobald eine Verbindungsanforderung empfangen wurde, ruft Winsock den von der Anwendung registrierten Rückruf zur bedingten Annahme auf. Nur wenn der Rückruf der bedingten Annahme CF_ACCEPT zurückgibt, benachrichtigt Winsock den Transport, um die Verbindung vollständig zu akzeptieren.

Wenn die option SO_CONDITIONAL_ACCEPT Socket aktiviert ist (auf TRUE festgelegt), hat dies mehrere Nebenwirkungen auf dem Socket:

  • Dadurch wird die integrierte SYN-Angriffsschutzabwehr des TCP-Stapels deaktiviert, da die Anwendung jetzt den Besitz der Annahme von Verbindungen übernimmt.
  • Dadurch wird der Listen-Backlog effektiv deaktiviert, da Verbindungen nicht im Namen eines Überwachungssockets 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 immer in einem Zustand ist, um die Annehmen-Rückrufe zur Annahme der Verbindung einfach zu verarbeiten. Wenn die Anwendung mit einer anderen Verarbeitung beschäftigt ist, kann die Clientseite ein Timeout ausführen, bevor die Anwendung die Verbindung tatsächlich akzeptiert. Dies führt zu einer schlechten Clienterfahrung.
  • Einige TCP-Stapeloptimierungen gelten auch nach Abschluss der bedingten Annahme nicht für vollständig akzeptierte Verbindungen. Dies kann die Leistung der Verbindung über die gesamte Lebensdauer verringern.

Im Allgemeinen besteht der Hauptgrund, warum Anwendungen die bedingte Annahme verwenden, darin, die vom verbindungsclient verwendete Quell-IP-Adresse oder den Port zu prüfen und dann zu entscheiden, die Verbindung anzunehmen oder abzulehnen. Anwendungen sind jedoch wahrscheinlich besser, wenn die Option SO_CONDITIONAL_ACCEPT nicht aktiviert ist und die Anwendung den TCP-Stapel und den Listenbacklog wie erwartet funktioniert. Wenn die Anwendung die akzeptierte Verbindung verarbeitet, wenn sie von einer unsachgemäßen IP-Quelladresse oder einem fehlerhaften Port stammt, kann die Anwendung den Socket einfach schließen. Der Sicherheitsnachteil dieses Verhaltens besteht darin, dass der Client nun die Bestätigung hat, dass die Anwendung auf eine IP-Adresse und einen Port lauscht, da sie die zuvor akzeptierte Verbindung erzwungen geschlossen hat. Allerdings überwiegen die Nachteile, SO_CONDITIONAL_ACCEPT diese Einschränkung im Allgemeinen überwiegen.

Die getsockopt-Funktion , die mit der Option SO_CONDITIONAL_ACCEPT Socket aufgerufen wird, ermöglicht es einer Anwendung, den aktuellen Status der Option für die bedingte Annahme abzurufen, obwohl dieses Feature normalerweise nicht verwendet wird. Wenn eine Anwendung die bedingte Annahme für einen Socket aktivieren muss, ruft sie lediglich die Setockopt-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.

Anforderungen

Anforderung Wert
Mindest unterstützter Client
Windows Vista [nur Desktop-Apps]
Unterstützter Mindestserver
Windows Server 2008 [Nur Desktop-Apps]
Header
Ws2def.h (enthalten Winsock2.h)

Siehe auch

getsockopt

setsockopt

WSAAccept