Sdílet prostřednictvím


možnost soketu SO_CONDITIONAL_ACCEPT

Možnost SO_CONDITIONAL_ACCEPT soketu je navržená tak, aby umožňovala aplikaci rozhodnout, jestli má příchozí připojení přijmout nebo ne.

Hodnota možnosti soketu

Konstanta, která představuje tuto možnost soketu, je 0x3002.

Syntaxe

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

Parametry

s [in]

Popisovač identifikující soket.

level [in]

Úroveň, na které je možnost definována. Pro tuto operaci použijte SOL_SOCKET .

optname [in]

Možnost soketu, pro kterou má být nastavena hodnota. Pro tuto operaci použijte SO_CONDITIONAL_ACCEPT .

optval [out]

Ukazatel na vyrovnávací paměť obsahující hodnotu, kterou má možnost nastavit. Tento parametr by měl odkazovat na vyrovnávací paměť rovnou nebo větší než velikost hodnoty DWORD .

Tato hodnota se považuje za logickou hodnotu s hodnotou 0 použitou k označení NEPRAVDA (zakázáno) a nenulové hodnoty označující hodnotu PRAVDA (povoleno).

optlen [in, out]

Ukazatel na velikost vyrovnávací paměti optval v bajtech. Tato velikost musí být rovna nebo větší než velikost hodnoty DWORD .

Návratová hodnota

Pokud se operace úspěšně dokončí, vrátí funkce setsockopt nulu.

Pokud operace selže, vrátí se hodnota SOCKET_ERROR a konkrétní kód chyby lze načíst voláním WSAGetLastError.

Kód chyby Meaning
WSANOTINITIALIZOVANÉ
Před použitím této funkce musí proběhnout úspěšné volání WSAStartup .
WSAENETDOWN
Síťový subsystém selhal.
WSAEFAULT
Jeden z optval nebo optlen parametrů ukazuje na paměť, která není v platné části adresního prostoru uživatele. Tato chyba se vrátí také v případě, že hodnota odkazovaná parametrem optlen je menší než velikost hodnoty DWORD .
WSAEINPROGRESS
Probíhá blokující volání Windows Sockets 1.1 nebo poskytovatel služeb stále zpracovává funkci zpětného volání.
WSAEINVAL
Parametr úrovně je neznámý nebo neplatný. Tato chyba se také vrátí, pokud je soket již ve stavu naslouchání.
WSAENOPROTOOPT
Možnost není známa nebo není podporována označenou rodinou protokolů.
WSAENOTSOCK
Popisovač není soket.

 

Poznámky

Funkce setsockopt volaná s možností soketu SO_CONDITIONAL_ACCEPT umožňuje aplikaci rozhodnout, jestli má příchozí připojení přijímat na naslouchání soketu nebo ne. Možnost podmíněného přijetí pro soket je ve výchozím nastavení zakázaná (nastavená na NEPRAVDA).

Pokud je tato možnost soketu povolená, zásobník TCP automaticky nepřijme připojení. Počká na to, že aplikace přijme připojení prostřednictvím podmíněného zpětného volání, zaregistrovaného ve funkci WSAAccept . Jakmile se přijme požadavek na připojení, služba Winsock vyvolá zpětné volání podmíněného přijetí zaregistrovaného aplikací. Pouze když podmíněný příjem zpětného volání vrátí CF_ACCEPT winsock oznámí přenosu, aby připojení plně přijal.

Pokud je možnost SO_CONDITIONAL_ACCEPT soketu nastavená na povolenou (nastavenou na hodnotu TRUE), má na soketu několik vedlejších efektů:

  • Tím se zakáže integrovaná ochrana před útoky SYN v zásobníku TCP, protože aplikace teď přebírá vlastnictví přijímání připojení.
  • Tím se efektivně zakáže backlog naslouchání, protože připojení nejsou přijata jménem naslouchacího soketu. Připojení není nikdy plně přijato, dokud aplikace plně přijme pomocí mechanismu CF_ACCEPT .
  • To také znamená, že aplikace musí být vždy ve stavu, aby snadno zvládla přijetí zpětného volání, aby připojení přijímala. Pokud je aplikace zaneprázdněná jiným zpracováním, může dojít k vypršení časového limitu na straně klienta, než aplikace skutečně přijme připojení. To vede ke špatnému prostředí klienta.
  • Některé optimalizace zásobníku TCP se nevztahují na plně přijatá připojení ani po dokončení podmíněného přijetí. Tím se může snížit výkon připojení po celou dobu jeho životnosti.

Hlavním důvodem, proč aplikace používají podmíněný příjem, je zkontrolovat zdrojovou IP adresu nebo port používaný připojujícím se klientem a pak se rozhodnout přijmout nebo odmítnout připojení. Aplikace ale pravděpodobně budou fungovat lépe, pokud není povolená možnost SO_CONDITIONAL_ACCEPT a aplikace umožňuje, aby zásobník TCP a backlog naslouchání fungovaly podle očekávání. Když aplikace zpracuje přijaté připojení, pokud pochází z nesprávné zdrojové IP adresy nebo portu, aplikace může jednoduše zavřít soket. Nevýhodou zabezpečení tohoto chování je, že teď klient potvrzuje, že aplikace naslouchá na IP adrese a portu, protože vynuceně ukončila dříve přijaté připojení. Nevýhody povolení SO_CONDITIONAL_ACCEPT však obecně převáží nad tímto omezením.

Funkce getsockopt volaná s možností soketu SO_CONDITIONAL_ACCEPT umožňuje aplikaci načíst aktuální stav možnosti podmíněného přijetí, i když se tato funkce běžně nepoužívá. Pokud aplikace potřebuje povolit podmíněný příjem na soketu, zavolá funkci setsockopt , aby tuto možnost povolila.

Všimněte si, že soubor hlaviček Ws2def.h je automaticky zahrnutý v rozhraní Winsock2.h a nikdy by neměl být použit přímo.

Požadavky

Požadavek Hodnota
Minimální podporovaný klient
Windows Vista [pouze desktopové aplikace]
Minimální podporovaný server
Windows Server 2008 [jenom desktopové aplikace]
Header
Ws2def.h (včetně rozhraní Winsock2.h)

Viz také

getsockopt

setsockopt

WSAAccept