Akceptowanie połączenia (Windows Sockets 2)
Gdy gniazdo nasłuchuje połączenia, program musi obsługiwać żądania połączeń w tym gniazdie.
Aby zaakceptować połączenie na gnieździe
Utwórz tymczasowy obiekt SOCKET o nazwie ClientSocket na potrzeby akceptowania połączeń od klientów.
SOCKET ClientSocket;
Zwykle aplikacja serwera zostałaby zaprojektowana tak, aby nasłuchiwała połączeń z wielu klientów. W przypadku serwerów o wysokiej wydajności wiele wątków jest często używanych do obsługi wielu połączeń klienckich.
Istnieje kilka różnych technik programowania przy użyciu protokołu Winsock, które mogą służyć do nasłuchiwania wielu połączeń klienckich. Jedną z technik programowania jest utworzenie pętli ciągłej, która sprawdza żądania połączeń przy użyciu funkcji nasłuchiwania (zobacz Nasłuchiwanie na gnieździe). Jeśli wystąpi żądanie połączenia, aplikacja wywołuje funkcję accept, AcceptExlub WSAAccept i przekazuje zadanie do innego wątku w celu obsługi tego żądania. Istnieje kilka innych technik programowania.
Należy pamiętać, że ten podstawowy przykład jest bardzo prosty i nie używa wielu wątków. Przykład po prostu nasłuchuje i akceptuje tylko jedno połączenie.
ClientSocket = INVALID_SOCKET; // Accept a client socket ClientSocket = accept(ListenSocket, NULL, NULL); if (ClientSocket == INVALID_SOCKET) { printf("accept failed: %d\n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return 1; }
Po zaakceptowaniu połączenia klienta aplikacja serwera zwykle przekazuje zaakceptowane gniazdo klienta (zmienną ClientSocket w powyższym przykładowym kodzie) do wątku roboczego lub portu uzupełniania we/wy i kontynuuje akceptowanie dodatkowych połączeń. W tym podstawowym przykładzie serwer kontynuuje kolejny krok.
Istnieje wiele innych technik programowania, które mogą służyć do nasłuchiwania i akceptowania wielu połączeń. Należą do nich korzystanie z funkcji select lub WSAPoll. Przykłady niektórych z tych różnych technik programowania przedstawiono w Advanced Winsock Samples dołączone do zestawu Microsoft Windows Software Development Kit (SDK).
Notatka
W systemach Unix typową techniką programowania dla serwerów było nasłuchiwanie połączeń przez aplikację. Po zaakceptowaniu połączenia proces nadrzędny wywoła funkcję rozwidlenia, aby utworzyć nowy proces podrzędny do obsługi połączenia klienta, dziedzicząc gniazdo z elementu nadrzędnego. Ta technika programowania nie jest obsługiwana w systemie Windows, ponieważ funkcja rozwidlenia
nie jest obsługiwana. Ta technika nie jest również zwykle odpowiednia dla serwerów o wysokiej wydajności, ponieważ zasoby potrzebne do utworzenia nowego procesu są znacznie większe niż te wymagane dla wątku.
Po wywołaniu funkcji , ListenSocket
nie jest już potrzebny w tym przykładzie. Funkcja closesocket jest wywoływana w celu zamknięcia gniazda.
// No longer need server socket
closesocket(ListenSocket);
Następny krok: odbieranie i wysyłanie danych na serwerze