2010-08-09 8 views
6

Mam aplikację opartą na serwerze Winsock, która korzysta z portów wejścia/wyjścia Windows Winsock.Winsock - przestań akceptować nowe połączenia, ale zachowaj łączność z istniejącymi połączeniami

Jako takie, każde akceptowane połączenie jest powiązane z gniazdem nasłuchowym, aby rozpocząć odbieranie powiadomień (odczyt, zapis, zamknięcie itp.).
Gniazdo nasłuchu ma zaległości w postaci 100 oczekujących połączeń.
Wszystko jest dobrze.

W pewnym momencie chcę przestać akceptować nowe połączenia, ale utrzymywać komunikację z już podłączonymi istniejącymi połączonymi gniazdami.

wyobraziłem mogłem zrobić jeden:

  1. Stop Calling WSAAccept().
  2. Ustawia zaległości na zero, skutecznie uniemożliwiając połączenie z penderem.
  3. Wyłączenie połączenia() & closesocket() na gnieździe nasłuchującym.

Teraz opcja # 1 daje oczekiwane wyniki; Moja aplikacja nie przetwarza nowych połączeń, ALE akceptuje do kwoty zaległości (100). Połączenia są praktycznie wykonane - nie chcę tego!

Opcja nr 2; Czy mogę to zrobić? W jaki sposób? Nie można znaleźć w witrynie MSDN ani w google. Dokumentacja listen() w MSDN mówi;

Jeśli funkcja nazywa się słuchać na gniazda już słuchania, to będzie sukces powrót bez zmiany wartości parametru zaległości. Ustawienie parametru backlog na 0 w kolejne wywołanie funkcji nasłuchiwania na gnieździe nasłuchowym nie jest uważane za prawidłowy reset, szczególnie jeśli istnieją połączenia w gnieździe.

Niedobrze dla mnie.
Gdybym mógł to zrobić w bezpieczny sposób, połączyłbym go z opcją nr 1, skutecznie przerywając tworzenie nowych połączeń na komputerze (przez port nasłuchiwania!).

Opcja nr 3 faktycznie działa; Po zamknięciu gniazda nasłuchującego nadal mogę komunikować się z istniejącymi połączeniami, a zaległości już nie ma (dobrze, zamknij gniazdo nasłuchu!).

Obawiam się, że takie podejście może mieć pewne skutki uboczne. Czy ktoś może potwierdzić?

Odpowiedz

8

Możesz po prostu zamknąć gniazdo nasłuchu. Przyjmowane połączenia mają własne gniazda i nie będzie to miało wpływu na zamknięcie gniazda nasłuchującego.

Na przykład w dokumentacji Microsoft znajduje się a sample server application, gdzie pokazano podstawowe użycie gniazda. Tam gniazdo nasłuchu jest zamknięte przed zakończeniem komunikacji przez zaakceptowane gniazdo (przed pętlą do-while).

+0

Tak, nr 3 jest właściwą odpowiedzią. –

+0

Doskonała odpowiedź!"Dowód" jest dokładnie tym, czego potrzebowałem dla spokoju ducha !! Widzisz, obawiałem się, że skojarzenie nowo zaakceptowanego połączenia z gniazdem nasłuchowym IOCP stworzy pewną zależność. Jeszcze raz dziękuję! – Poni

Powiązane problemy