Erstellen eines Sockets für den Server
Nach der Initialisierung muss ein SOCKET-Objekt für die Verwendung durch den Server instanziiert werden.
So erstellen Sie einen Socket für den Server
Die getaddrinfo-Funktion wird verwendet, um die Werte in der sockaddr-Struktur zu bestimmen:
- AF _ INET wird verwendet, um die IPv4-Adressfamilie anzugeben.
- SOCK _ STREAM wird verwendet, um einen Streamsocket anzugeben.
- IPPROTO _ TCP wird verwendet, um das TCP-Protokoll anzugeben.
- KI _ Das PASSIVE-Flag gibt an, dass der Aufrufer die zurückgegebene Socketadressstruktur in einem Aufruf der Bind-Funktion verwenden möchte. Wenn das AI _ PASSIVE-Flag festgelegt ist und der Nodename-Parameter für die getaddrinfo-Funktion ein NULL-Zeiger ist, wird der IP-Adressteil der Socketadressstruktur für IPv4-Adressen auf INADDR _ ANY oder für IPv6-Adressen auf IN6ADDR _ ANY _ INIT festgelegt.
- 27015 ist die Portnummer, die dem Server zugeordnet ist, mit dem der Client eine Verbindung herstellt.
Die addrinfo-Struktur wird von der getaddrinfo-Funktion verwendet.
#define DEFAULT_PORT "27015" struct addrinfo *result = NULL, *ptr = NULL, hints; ZeroMemory(&hints, sizeof (hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = AI_PASSIVE; // Resolve the local address and port to be used by the server iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); if (iResult != 0) { printf("getaddrinfo failed: %d\n", iResult); WSACleanup(); return 1; }Erstellen Sie ein SOCKET-Objekt namens ListenSocket, damit der Server auf Clientverbindungen lauscht.
SOCKET ListenSocket = INVALID_SOCKET;Rufen Sie die Socketfunktion auf, und geben Sie ihren Wert an die ListenSocket-Variable zurück. Verwenden Sie für diese Serveranwendung die erste IP-Adresse, die durch den Aufruf von getaddrinfo zurückgegeben wird, die mit der Adressfamilie, dem Sockettyp und dem Protokoll übereinstimmt, die im Hints-Parameter angegeben sind. In diesem Beispiel wurde ein TCP-Streamsocket für IPv4 mit einer Adressfamilie von IPv4, einem Sockettyp von SOCK _ STREAM und einem Protokoll von IPPROTO TCP _ angefordert. Daher wird eine IPv4-Adresse für listenSocket angefordert.
Wenn die Serveranwendung IPv6 abhören möchte, muss die Adressfamilie _ im Hints-Parameter auf AF INET6 festgelegt werden. Wenn ein Server sowohl auf IPv6 als auch auf IPv4 lauschen möchte, müssen zwei Listensockets erstellt werden, einer für IPv6 und einer für IPv4. Diese beiden Sockets müssen von der Anwendung separat behandelt werden.
Windows Vista und höher bieten die Möglichkeit, einen einzelnen IPv6-Socket zu erstellen, der in den Dual Stack-Modus versetzt wird, um sowohl auf IPv6 als auch auf IPv4 zu lauschen. Weitere Informationen zu diesem Feature finden Sie unter Dual-Stack-Sockets.
// Create a SOCKET for the server to listen for client connections ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);Überprüfen Sie auf Fehler, um sicherzustellen, dass der Socket ein gültiger Socket ist.
if (ListenSocket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; }
Nächster Schritt: Binden eines Sockets