Přijetí připojení (Windows Sockets 2)
Jakmile soket naslouchá připojení, musí program zpracovávat požadavky na připojení na daném soketu.
Přijmout připojení na socketu
Vytvořte dočasný objekt SOCKET s názvem ClientSocket pro příjem připojení z klientů.
SOCKET ClientSocket;
Za normálních okolností by serverová aplikace byla navržena tak, aby naslouchala připojení z více klientů. U vysoce výkonných serverů se k zpracování více klientských připojení běžně používá více vláken.
Existuje několik různých programovacích technik s Winsockem, které se dají použít pro naslouchání více připojení klientů. Jednou z programovacích technik je vytvoření průběžné smyčky, která kontroluje požadavky na připojení pomocí funkce naslouchání (viz Naslouchání na soketu). Pokud dojde k žádosti o připojení, aplikace zavolá funkci accept, AcceptExnebo WSAAccept a předá zpracování požadavku jinému vláknu. Je možné několik dalších programovacích technik.
Všimněte si, že tento základní příklad je velmi jednoduchý a nepoužívá více vláken. Příklad také naslouchá a přijímá pouze jedno připojení.
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 přijetí připojení klienta by serverová aplikace normálně předala akceptovaný klientský soket (proměnnou ClientSocket ve výše uvedeném vzorovém kódu) do pracovního vlákna nebo portu pro dokončení vstupně-výstupních operací a pokračovala v přijímání dalších připojení. V tomto základním příkladu server pokračuje dalším krokem.
Existuje řada dalších programovacích technik, které lze použít k naslouchání a přijímání více připojení. K těmto možnostem patří použití funkcí nebo WSAPoll. Příklady některých z těchto různých programovacích technik jsou znázorněny v Pokročilých ukázkách Winsock, které jsou součástí sady Microsoft Windows Software Development Kit (SDK).
Poznámka
V systémech Unix byla běžnou programovací technikou pro servery, aby aplikace naslouchala připojení. Když bylo připojení přijato, nadřazený proces zavolá funkci fork, aby vytvořil nový podřízený proces pro zpracování připojení klienta, který dědí socket z nadřazeného procesu. Tato programovací technika není ve Windows podporovaná, protože funkce forku není podporovaná. Tato technika není obvykle vhodná pro vysoce výkonné servery, protože prostředky potřebné k vytvoření nového procesu jsou mnohem větší než prostředky potřebné pro vlákno.
Jakmile se zavolá funkce přijmout, ListenSocket
již není pro tento příklad třeba. Funkce closesocket je volána k zavření soketu.
// No longer need server socket
closesocket(ListenSocket);
Další krok: příjem a odesílání dat na serveru