Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Po zainicjowaniu należy stworzyć obiekt SOCKET do użycia przez serwer.
Aby utworzyć gniazdo dla serwera
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; }Utwórz obiekt SOCKET o nazwie ListenSocket, aby serwer nasłuchiwał połączeń klienckich.
SOCKET ListenSocket = INVALID_SOCKET;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);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
Tematy pokrewne