Udostępnij przez


Tworzenie gniazda dla serwera

Po zainicjowaniu należy stworzyć obiekt SOCKET do użycia przez serwer.

Aby utworzyć gniazdo dla serwera

  1. Funkcja getaddrinfo służy do określania wartości w strukturze sockaddr:

    • AF_INET służy do określania rodziny adresów IPv4.
    • SOCK_STREAM służy do określania gniazda strumienia.
    • IPPROTO_TCP służy do określania protokołu TCP.
    • AI_PASSIVE flaga wskazuje, że obiekt wywołujący zamierza użyć zwracanej struktury adresu gniazda w wywołaniu funkcji bind. Gdy flaga AI_PASSIVE jest ustawiona i parametr nodename do funkcji getaddrinfo jest wskaźnikiem NULL, część adresu IP struktury adresów gniazda jest ustawiona na INADDR_ANY dla adresów IPv4 lub IN6ADDR_ANY_INIT dla adresów IPv6.
    • 27015 to numer portu skojarzony z serwerem, z którymi klient będzie się łączyć.

    Struktura jest używana przez funkcję getaddrinfo.

    #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. Utwórz obiekt SOCKET o nazwie ListenSocket, aby serwer nasłuchiwał połączeń klienckich.

    SOCKET ListenSocket = INVALID_SOCKET;
    
  3. Wywołaj funkcjęgniazdai zwróć jej wartość do zmiennej ListenSocket. W przypadku tej aplikacji serwera użyj pierwszego adresu IP zwróconego przez wywołanie getaddrinfo, który był zgodny z rodziną adresów, typem gniazda i protokołem określonym w parametrze hints. W tym przykładzie zażądano gniazda strumienia TCP dla protokołu IPv4 z rodziną adresów IPv4, typem gniazda SOCK_STREAM i protokołem IPPROTO_TCP. Dlatego dla protokołu ListenSocket jest wymagany adres IPv4.

    Jeśli aplikacja serwera chce nasłuchiwać dla IPv6, należy ustawić rodzinę adresów na AF_INET6 w parametrze porad. Jeśli serwer chce nasłuchiwać zarówno protokołów IPv6, jak i IPv4, należy utworzyć dwa gniazda nasłuchiwania, jeden dla protokołu IPv6 i jeden dla protokołu IPv4. Te dwa gniazda muszą być obsługiwane oddzielnie przez aplikację.

    System Windows Vista i nowsze oferują możliwość utworzenia pojedynczego gniazda IPv6, które jest umieszczane w trybie podwójnego stosu do nasłuchiwania zarówno na IPv6, jak i IPv4. Aby uzyskać więcej informacji na temat tej funkcji, zobacz 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. Sprawdź błędy, aby upewnić się, że gniazdo jest prawidłowym gniazdem.

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

Następny krok: wiązanie gniazda

Rozpoczęcie pracy z Winsock

Inicjowanie Winsock

aplikacja serwerowa Winsock