Udostępnij przez


opcja gniazda SO_CONDITIONAL_ACCEPT

Opcja gniazda SO_CONDITIONAL_ACCEPT została zaprojektowana tak, aby umożliwić aplikacji podjęcie decyzji, czy zaakceptować przychodzące połączenie na gniazdach nasłuchiwania.

Wartość opcji gniazda

Stała reprezentująca tę opcję gniazda jest 0x3002.

Składnia

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]

Deskryptor identyfikujący gniazdo.

poziom [in]

Poziom, na którym zdefiniowano opcję. Użyj SOL_SOCKET dla tej operacji.

optname [in]

Opcja gniazda, dla której ma zostać ustawiona wartość. Użyj SO_CONDITIONAL_ACCEPT dla tej operacji.

optval [out]

Wskaźnik do buforu zawierającego wartość opcji do ustawienia. Ten parametr powinien wskazywać bufor równy lub większy niż rozmiar wartości DWORD .

Ta wartość jest traktowana jako wartość logiczna z wartością 0 używaną do wskazania wartości FALSE (wyłączone) i wartości innej niżzerowa wskazująca wartość TRUE (włączona).

optlen [in, out]

Wskaźnik do rozmiaru w bajtach buforu optval . Ten rozmiar musi być równy lub większy niż rozmiar wartości DWORD .

Wartość zwracana

Jeśli operacja zakończy się pomyślnie, funkcja setsockopt zwraca zero.

Jeśli operacja zakończy się niepowodzeniem, zostanie zwrócona wartość SOCKET_ERROR i można pobrać określony kod błędu, wywołując metodę WSAGetLastError.

Kod błędu Meaning
WSANOTINITIALISED
Przed użyciem tej funkcji musi wystąpić pomyślne wywołanie WSAStartup .
WSAENETDOWN
Podsystem sieciowy uległ awarii.
WSAEFAULT
Jeden z parametrów optval lub optlen wskazuje pamięć, która nie znajduje się w prawidłowej części przestrzeni adresowej użytkownika. Ten błąd jest również zwracany, jeśli wartość wskazywana przez parametr optlen jest mniejsza niż rozmiar wartości DWORD .
WSAEINPROGRESS
Trwa blokowanie wywołania Windows Sockets 1.1 lub dostawca usług nadal przetwarza funkcję wywołania zwrotnego.
WSAEINVAL
Parametr poziomu jest nieznany lub nieprawidłowy. Ten błąd jest również zwracany, jeśli gniazdo było już w stanie nasłuchiwania.
WSAENOPROTOOPT
Opcja jest nieznana lub nieobsługiwana przez wskazaną rodzinę protokołów.
WSAENOTSOCK
Deskryptor nie jest gniazdem.

 

Uwagi

Funkcja setsockopt wywoływana z opcją gniazda SO_CONDITIONAL_ACCEPT pozwala aplikacji zdecydować, czy zaakceptować połączenie przychodzące na gniazda nasłuchiwania. Opcja akceptowania warunkowego gniazda jest domyślnie wyłączona (ustawiona na FAŁSZ).

Po włączeniu tej opcji gniazda stos TCP nie akceptuje automatycznie połączeń. Oczekuje, aż aplikacja wskaże, że akceptuje połączenie za pośrednictwem funkcji WSAAccept warunkowego akceptowania zwrotnego. Po odebraniu żądania połączenia usługa Winsock wywołuje warunkowe wywołanie zwrotne akceptowania zarejestrowane przez aplikację. Tylko wtedy, gdy warunkowe akceptowanie wywołania zwrotnego zwróci CF_ACCEPT usługa Winsock powiadomi transport o pełnym zaakceptowaniu połączenia.

Gdy opcja gniazda SO_CONDITIONAL_ACCEPT jest ustawiona na włączoną (ustawioną na wartość TRUE), ma to kilka skutków ubocznych dla gniazda:

  • Wyłącza to wbudowane zabezpieczenia ochrony przed atakami SYN stosu TCP, ponieważ aplikacja przejmuje własność akceptowania połączeń.
  • To skutecznie wyłącza listę prac nasłuchiwania, ponieważ połączenia nie są akceptowane w imieniu gniazda nasłuchiwania. Połączenie nigdy nie jest w pełni akceptowane, dopóki aplikacja w pełni nie zaakceptuje mechanizmu CF_ACCEPT .
  • Oznacza to również, że aplikacja zawsze musi być w stanie, aby łatwo obsługiwać wywołania zwrotne akceptowania w celu zaakceptowania połączenia. Jeśli aplikacja jest zajęta przez inne przetwarzanie, po stronie klienta może upłynąć limit czasu, zanim aplikacja rzeczywiście zaakceptuje połączenie. Prowadzi to do złego środowiska klienta.
  • Niektóre optymalizacje stosu TCP nie mają zastosowania do w pełni akceptowanych połączeń nawet po zakończeniu akceptowania warunkowego. Może to zmniejszyć wydajność połączenia przez cały okres istnienia.

Ogólnie rzecz biorąc, głównym powodem, dla którego aplikacje używają akceptacji warunkowej, jest sprawdzenie źródłowego adresu IP lub portu używanego przez klienta łączącego, a następnie podjęcie decyzji o zaakceptowaniu lub odrzuceniu połączenia. Jednak aplikacje mogą działać lepiej, jeśli opcja SO_CONDITIONAL_ACCEPT nie jest włączona, a aplikacja zezwala na stos TCP i listę prac nasłuchiwania działają zgodnie z oczekiwaniami. Następnie, gdy aplikacja obsługuje zaakceptowane połączenie, jeśli pochodzi z nieprawidłowego adresu źródłowego lub portu IP, aplikacja może po prostu zamknąć gniazdo. Wadą zabezpieczeń tego zachowania jest to, że teraz klient ma potwierdzenie, że aplikacja nasłuchuje na adresie IP i porcie, ponieważ wymusiło zamknięcie wcześniej zaakceptowanego połączenia. Jednak wady włączania SO_CONDITIONAL_ACCEPT ogólnie przewyższają to ograniczenie.

Funkcja getsockopt wywoływana z opcją gniazda SO_CONDITIONAL_ACCEPT umożliwia aplikacji pobranie bieżącego stanu opcji akceptowania warunkowego, chociaż ta funkcja nie jest zwykle używana. Jeśli aplikacja musi włączyć akceptowanie warunkowe w gniazdie, po prostu wywołuje funkcję setsockopt , aby włączyć tę opcję.

Należy pamiętać, że plik nagłówka Ws2def.h jest automatycznie dołączany do pliku Winsock2.h i nigdy nie powinien być używany bezpośrednio.

Requirements

Wymaganie Wartość
Minimalny obsługiwany klient
Windows Vista [tylko aplikacje klasyczne]
Minimalny obsługiwany serwer
Windows Server 2008 [tylko aplikacje klasyczne]
Header
Ws2def.h (w tym Winsock2.h)

Zobacz także

getsockopt

setsockopt

WSAAccept