Freigeben über


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

  1. 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.
    • AI_PASSIVE Flag gibt an, dass der Aufrufer die zurückgegebene Socketadressstruktur in einem Aufruf der Bindfunktion verwenden möchte. Wenn das flag AI_PASSIVE festgelegt ist und der nodename-Parameter auf die getaddrinfo-Funktion ein NULL-Zeiger ist, wird der IP-Adressteil der Socketadressstruktur auf INADDR_ANY für IPv4-Adressen oder IN6ADDR_ANY_INIT für IPv6-Adressen 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;
    }
    
  2. Erstellen Sie ein SOCKET-Objekt namens ListenSocket, damit der Server auf Clientverbindungen lauscht.

    SOCKET ListenSocket = INVALID_SOCKET;
    
  3. 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 vom 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 das ListenSocket angefordert.

    Wenn die Serveranwendung auf IPv6 lauschen möchte, muss die Adressfamilie im Hinweisparameter 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);
    
  4. Ü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

Erste Schritte mit Winsock

Initialisieren von Winsock

Winsock Server-Anwendung