SO_CONDITIONAL_ACCEPT Socketoption
Die SO_CONDITIONAL_ACCEPT Socketoption ist so konzipiert, dass eine Anwendung entscheiden kann, ob eine eingehende Verbindung auf einem Lauschocket akzeptiert werden soll oder nicht.
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 für diesen Vorgang SOL_SOCKET .
-
optname [in]
-
Die Socketoption, für die der Wert festgelegt werden soll. Verwenden Sie für diesen Vorgang SO_CONDITIONAL_ACCEPT .
-
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 der Größe eines DWORD-Werts entspricht oder größer ist.
Dieser Wert wird als boolescher Wert behandelt, wobei 0 verwendet wird, um FALSE (deaktiviert) anzugeben, und ein nonzero-Wert, 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 null zurück.
Wenn der Vorgang fehlschlägt, wird der Wert SOCKET_ERROR zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen von WSAGetLastError abgerufen werden.
Fehlercode | Bedeutung |
---|---|
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen. |
|
Beim Netzwerksubsystem ist ein Fehler aufgetreten. |
|
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. |
|
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion. |
|
Der Levelparameter ist unbekannt oder ungültig. Dieser Fehler wird auch zurückgegeben, wenn sich der Socket bereits im Lauschzustand befand. |
|
Die Option ist unbekannt oder wird von der angegebenen Protokollfamilie nicht unterstützt. |
|
Der Deskriptor ist kein Socket. |
Bemerkungen
Die setockopt-Funktion , die mit der SO_CONDITIONAL_ACCEPT Socketoption aufgerufen wird, ermöglicht es einer Anwendung zu entscheiden, ob eine eingehende Verbindung auf einem Lauschocket akzeptiert werden soll oder nicht. Die Option "Bedingtes Akzeptieren" für einen Socket ist standardmäßig deaktiviert (auf FALSE festgelegt).
Wenn diese Socketoption aktiviert ist, akzeptiert der TCP-Stapel keine Verbindungen automatisch. Es wartet, bis die Anwendung angibt, dass sie die Verbindung über den mit der WSAAccept-Funktion registrierten bedingten Annehmen-Rückruf akzeptiert. Sobald eine Verbindungsanforderung empfangen wurde, ruft Winsock den von der Anwendung registrierten Rückruf der 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 SO_CONDITIONAL_ACCEPT Socketoption auf aktiviert (auf TRUE festgelegt) festgelegt ist, hat dies mehrere Nebenwirkungen auf den Socket:
- Dadurch wird der integrierte SYN-Angriffsschutz des TCP-Stapels deaktiviert, da die Anwendung jetzt den Besitz für die Annahme von Verbindungen übernimmt.
- Dadurch wird das Listenbacklog effektiv deaktiviert, da Verbindungen im Namen eines Abhörsockets 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 achtet, sich immer in einem Zustand zu befinden, um die Rückrufe zur Annahme der Verbindung problemlos zu verarbeiten. Wenn die Anwendung mit anderen Verarbeitungsvorgängen 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.
Im Allgemeinen besteht der Standard Grund, warum Anwendungen bedingte Akzeptanz verwenden, darin, die Quell-IP-Adresse oder den port zu überprüfen, die vom verbindenden Client verwendet wird, und dann entscheiden, die Verbindung zu akzeptieren oder abzulehnen. Anwendungen werden jedoch wahrscheinlich besser funktionieren, wenn die Option SO_CONDITIONAL_ACCEPT nicht aktiviert ist und die Anwendung den TCP-Stapel und das Listenbacklog wie erwartet funktioniert. Wenn die Anwendung dann die akzeptierte Verbindung verarbeitet, kann die Anwendung einfach den Socket schließen, wenn sie von einer falschen IP-Quelladresse oder einem falschen Port stammt. Der Sicherheitsnachteil dieses Verhaltens besteht darin, dass der Client jetzt bestätigt hat, dass die Anwendung eine IP-Adresse und einen Port lauscht, da die zuvor akzeptierte Verbindung gewaltsam geschlossen wurde. Die Nachteile bei der Aktivierung SO_CONDITIONAL_ACCEPT jedoch im Allgemeinen überwiegen diese Einschränkung.
Die getockopt-Funktion , die mit der Socketoption SO_CONDITIONAL_ACCEPT aufgerufen wird, ermöglicht einer Anwendung das Abrufen des aktuellen Zustands der Option für bedingte Akzeptanz, obwohl dies normalerweise nicht verwendet wird. Wenn eine Anwendung die bedingte Annahme für einen Socket aktivieren muss, ruft sie just die setockopt-Funktion auf, um die Option zu aktivieren.
Beachten Sie, dass die Ws2def.h-Headerdatei automatisch in Winsock2.h enthalten ist und nie direkt verwendet werden sollte.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) |
Windows Vista [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) |
Windows Server 2008 [nur Desktop-Apps] |
Header |
|
Siehe auch