Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De SO_CONDITIONAL_ACCEPT socketoptie is ontworpen om een toepassing toe te staan om te bepalen of een binnenkomende verbinding op een listening socket al dan niet moet worden geaccepteerd.
Waarde van socketoptie
De constante die deze socketoptie vertegenwoordigt, is 0x3002.
Syntaxis
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
);
Parameterwaarden
-
s [in]
-
Een descriptor die de socket identificeert.
-
niveau [in]
-
Het niveau waarop de optie is gedefinieerd. Gebruik SOL_SOCKET voor deze bewerking.
-
optname [in]
-
De socketoptie waarvoor de waarde moet worden ingesteld. Gebruik SO_CONDITIONAL_ACCEPT voor deze bewerking.
-
optval [out]
-
Een aanwijzer naar de buffer met de waarde voor de optie die moet worden ingesteld. Deze parameter moet verwijzen naar buffer die gelijk is aan of groter is dan de grootte van een DWORD-waarde .
Deze waarde wordt behandeld als een Booleaanse waarde met 0 die wordt gebruikt om ONWAAR (uitgeschakeld) en een niet-nulwaarde aan te geven om TRUE (ingeschakeld) aan te geven.
-
optlen [in, uit]
-
Een aanwijzer naar de grootte, in bytes, van de optvalbuffer . Deze grootte moet gelijk zijn aan of groter zijn dan de grootte van een DWORD-waarde .
Retourwaarde
Als de bewerking is voltooid, retourneert setsockopt nul.
Als de bewerking mislukt, wordt een waarde van SOCKET_ERROR geretourneerd en kan een specifieke foutcode worden opgehaald door WSAGetLastError aan te roepen.
| Foutcode | Meaning |
|---|---|
| Een geslaagde WSAStartup-aanroep moet plaatsvinden voordat u deze functie gebruikt. |
|
| Het netwerksubsysteem is mislukt. |
|
| Een van de optval - of optlenparameters wijst naar het geheugen dat zich niet in een geldig deel van de adresruimte van de gebruiker bevindt. Deze fout wordt ook geretourneerd als de waarde die wordt verwezen door de optlen-parameter kleiner is dan de grootte van een DWORD-waarde . |
|
| Er wordt een aanroep van Windows Sockets 1.1 geblokkeerd of de serviceprovider verwerkt nog steeds een callback-functie. |
|
| De niveauparameter is onbekend of ongeldig. Deze fout wordt ook geretourneerd als de socket al een luisterstatus heeft. |
|
| De optie is onbekend of niet ondersteund door de aangegeven protocolfamilie. |
|
| De descriptor is geen socket. |
Opmerkingen
Met de setsockopt-functie die met de SO_CONDITIONAL_ACCEPT socketoptie wordt aangeroepen, kan een toepassing bepalen of een binnenkomende verbinding op een listening socket al dan niet mag worden geaccepteerd. De optie voorwaardelijk accepteren voor een socket is standaard uitgeschakeld (ingesteld op ONWAAR).
Wanneer deze socketoptie is ingeschakeld, accepteert de TCP-stack geen verbindingen automatisch. Er wordt gewacht totdat de toepassing aangeeft dat de verbinding wordt geaccepteerd via de callback voor voorwaardelijk accepteren die is geregistreerd bij de functie WSAAccept . Zodra een verbindingsaanvraag is ontvangen, roept Winsock de callback voor voorwaardelijk accepteren aan die is geregistreerd door de toepassing. Alleen wanneer de callback voor voorwaardelijk accepteren CF_ACCEPT winsock het transport op de hoogte stelt om de verbinding volledig te accepteren.
Wanneer de SO_CONDITIONAL_ACCEPT socketoptie is ingesteld op ingeschakeld (ingesteld op TRUE), heeft dit verschillende bijwerkingen op de socket:
- Hiermee schakelt u de ingebouwde beveiliging tegen SYN-aanvallen van de TCP-stack uit, omdat de toepassing nu eigenaar wordt van het accepteren van verbindingen.
- Hierdoor wordt de luisterachterstand effectief uitgeschakeld omdat verbindingen niet worden geaccepteerd namens een listening socket. Een verbinding wordt nooit volledig geaccepteerd totdat de toepassing het CF_ACCEPT mechanisme volledig accepteert.
- Dit betekent ook dat de toepassing altijd de status heeft om de callbacks voor accepteren gemakkelijk te verwerken om de verbinding te accepteren. Als de toepassing bezig is met andere verwerking, kan er een time-out optreden aan de clientzijde voordat de toepassing de verbinding daadwerkelijk accepteert. Dit leidt tot een slechte clientervaring.
- Sommige TCP-stackoptimalisaties zijn niet van toepassing op volledig geaccepteerde verbindingen, zelfs nadat de voorwaardelijke acceptatie is voltooid. Dit kan de prestaties van de verbinding gedurende de gehele levensduur verminderen.
Over het algemeen is de belangrijkste reden dat toepassingen voorwaardelijk accepteren gebruiken het bron-IP-adres of de poort die door de verbindingsclient wordt gebruikt, inspecteren en vervolgens besluiten om de verbinding te accepteren of af te wijzen. Toepassingen zullen echter waarschijnlijk beter presteren als de optie SO_CONDITIONAL_ACCEPT niet is ingeschakeld en de toepassing de TCP-stack en de luisterachterstand naar verwachting toestaat. Wanneer de toepassing vervolgens de geaccepteerde verbinding afhandelt, als deze afkomstig is van een onjuist IP-bronadres of -poort, kan de toepassing gewoon de socket sluiten. Het beveiligingsnadelen van dit gedrag is dat de client nu heeft bevestigd dat de toepassing luistert op een IP-adres en poort, omdat de eerder geaccepteerde verbinding geforceerd is gesloten. De nadelen van het inschakelen van SO_CONDITIONAL_ACCEPT wegen echter over het algemeen op tegen deze beperking.
Met de functie getsockopt die wordt aangeroepen met de SO_CONDITIONAL_ACCEPT socketoptie, kan een toepassing de huidige status van de optie voor voorwaardelijk accepteren ophalen, hoewel dit een functie is die normaal gesproken niet wordt gebruikt. Als een toepassing voorwaardelijk accepteren op een socket moet inschakelen, roept deze alleen de setsockopt-functie aan om de optie in te schakelen.
Houd er rekening mee dat het headerbestand Ws2def.h automatisch wordt opgenomen in Winsock2.h en nooit rechtstreeks mag worden gebruikt.
Requirements
| Requirement | Waarde |
|---|---|
| Minimaal ondersteunde client |
Windows Vista [alleen desktop-apps] |
| Minimaal ondersteunde server |
Windows Server 2008 [alleen desktop-apps] |
| Header |
|
Zie ook