Erstellen eines Sockets für den Client

Nach der Initialisierung muss ein SOCKET-Objekt für die Verwendung durch den Client instanziiert werden.

So erstellen Sie einen Socket

  1. Deklarieren Sie ein addrinfo-Objekt , das eine sockaddr-Struktur enthält, und initialisieren Sie diese Werte. Für diese Anwendung ist die Internetadressfamilie nicht angegeben, sodass entweder eine IPv6- oder IPv4-Adresse zurückgegeben werden kann. Die Anwendung fordert den Sockettyp als Streamsocket für das TCP-Protokoll an.

    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;
    
  2. Rufen Sie die getaddrinfo-Funktion auf, um die IP-Adresse für den Servernamen anzufordern, der über die Befehlszeile übergeben wird. Der TCP-Port auf dem Server, mit dem der Client eine Verbindung herstellt, wird in diesem Beispiel von DEFAULT_PORT als 27015 definiert. Die getaddrinfo-Funktion gibt ihren Wert als ganze Zahl zurück, die auf Fehler überprüft wird.

    #define DEFAULT_PORT "27015"
    
    // Resolve the server address and port
    iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }
    
  3. Erstellen Sie ein SOCKET-Objekt mit dem Namen ConnectSocket.

    SOCKET ConnectSocket = INVALID_SOCKET;
    
  4. Rufen Sie die Socketfunktion auf, und geben Sie ihren Wert an die ConnectSocket-Variable zurück. Verwenden Sie für diese Anwendung die erste IP-Adresse, die vom Aufruf von getaddrinfo zurückgegeben wird, die der Adressfamilie, dem Sockettyp und dem Protokoll entspricht, die im hints-Parameter angegeben sind. In diesem Beispiel wurde ein TCP-Streamsocket mit dem Sockettyp SOCK_STREAM und einem Protokoll von IPPROTO_TCP angegeben. Die Adressfamilie wurde nicht angegeben (AF_UNSPEC), sodass die zurückgegebene IP-Adresse entweder eine IPv6- oder IPv4-Adresse für den Server sein kann.

    Wenn die Clientanwendung nur eine Verbindung mit IPv6 oder IPv4 herstellen möchte, muss die Adressfamilie im Hinweisparameter auf AF_INET6 für IPv6 oder AF_INET für IPv4 festgelegt werden.

    // Attempt to connect to the first address returned by
    // the call to getaddrinfo
    ptr=result;
    
    // Create a SOCKET for connecting to server
    ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
        ptr->ai_protocol);
    
  5. Überprüfen Sie auf Fehler, um sicherzustellen, dass der Socket ein gültiger Socket ist.

    if (ConnectSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }
    

Die an die Socketfunktion übergebenen Parameter können für verschiedene Implementierungen geändert werden.

Fehlererkennung ist ein wichtiger Bestandteil des erfolgreichen Netzwerkcodes. Wenn der Socketaufruf fehlschlägt, wird INVALID_SOCKET zurückgegeben. Die if-Anweisung im vorherigen Code wird verwendet, um alle Fehler abzufangen, die beim Erstellen des Sockets aufgetreten sind. WSAGetLastError gibt eine Fehlernummer zurück, die dem letzten aufgetretenen Fehler zugeordnet ist.

Hinweis

Je nach Anwendung kann eine umfangreichere Fehlerprüfung erforderlich sein.

Das Festlegen hints.ai_family auf AF_UNSPEC kann beispielsweise dazu führen, dass der Verbindungsaufruf fehlschlägt. Verwenden Sie in diesem Fall stattdessen einen bestimmten IPv4- (AF_INET) oder IPv6-Wert (AF_INET6).

WSACleanup wird verwendet, um die Verwendung der WS2_32 DLL zu beenden.

Nächster Schritt: Herstellen einer Verbindung mit einem Socket

Erste Schritte mit Winsock

Initialisieren von Winsock

Winsock-Clientanwendung