Acceptera en anslutning (Windows Sockets 2)
När socketen lyssnar på en anslutning måste programmet hantera anslutningsförfrågningar på socketen.
Acceptera en anslutning på en socket
Skapa ett tillfälligt SOCKET- objekt med namnet ClientSocket för att acceptera anslutningar från klienter.
SOCKET ClientSocket;
Normalt skulle ett serverprogram vara utformat för att lyssna efter anslutningar från flera klienter. För servrar med höga prestanda används flera trådar ofta för att hantera flera klientanslutningar.
Det finns flera olika programmeringstekniker med Winsock som kan användas för att lyssna efter flera klientanslutningar. En programmeringsteknik är att skapa en kontinuerlig loop som söker efter anslutningsbegäranden med hjälp av funktionen lyssna (se Lyssna på en Socket-). Om en anslutningsbegäran inträffar anropar programmet funktionen acceptera, AcceptExeller WSAAccept och skickar arbetet till en annan tråd för att hantera begäran. Flera andra programmeringstekniker är möjliga.
Observera att det här grundläggande exemplet är mycket enkelt och inte använder flera trådar. Exemplet lyssnar också bara efter och accepterar endast en enda anslutning.
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; }
När klientanslutningen har accepterats skickar ett serverprogram normalt den godkända klientsocketen (ClientSocket-variabeln i exempelkoden ovan) till en arbetstråd eller en I/O-slutförandeport och fortsätter att acceptera ytterligare anslutningar. I det här grundläggande exemplet fortsätter servern till nästa steg.
Det finns ett antal andra programmeringstekniker som kan användas för att lyssna efter och acceptera flera anslutningar. Dessa inkluderar att använda ,, eller WSAPoll funktioner. Exempel på några av dessa olika programmeringstekniker visas i Avancerade Winsock-exempel ingår i Microsoft Windows Software Development Kit (SDK).
Not
I Unix-system var en vanlig programmeringsteknik för servrar att ett program skulle lyssna efter anslutningar. När en anslutning accepterades anropar den överordnade processen den förgreningsfunktionen för att skapa en ny underordnad process för att hantera klientanslutningen och ärver socketen från den överordnade. Den här programmeringstekniken stöds inte i Windows eftersom den förgreningsfunktionen inte stöds. Den här tekniken är inte heller vanligtvis lämplig för högpresterande servrar, eftersom de resurser som behövs för att skapa en ny process är mycket större än de som behövs för en tråd.
När accepterar-funktionen anropas behövs inte längre ListenSocket
för det här exemplet. Funktionen closesocket anropas för att stänga socketen.
// No longer need server socket
closesocket(ListenSocket);
Nästa steg: att ta emot och skicka data på servern