Criando um soquete para o servidor
Após a inicialização, um objeto SOCKET deve ser instanciado para uso pelo servidor.
Para criar um soquete para o servidor
A função getaddrinfo é usada para determinar os valores na estrutura sockaddr :
- AF_INET é usado para especificar a família de endereços IPv4.
- SOCK_STREAM é usado para especificar um soquete de fluxo.
- IPPROTO_TCP é usado para especificar o protocolo TCP .
- AI_PASSIVE sinalizador indica que o chamador pretende usar a estrutura de endereço de soquete retornada em uma chamada para a função de associação . Quando o sinalizador AI_PASSIVE é definido e o parâmetro nodename para a função getaddrinfo é um ponteiro NULL , a parte do endereço IP da estrutura de endereços de soquete é definida como INADDR_ANY para endereços IPv4 ou IN6ADDR_ANY_INIT para endereços IPv6.
- 27015 é o número da porta associado ao servidor ao qual o cliente se conectará.
A estrutura addrinfo é usada pela função 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; }
Crie um objeto SOCKET chamado ListenSocket para o servidor escutar conexões de cliente.
SOCKET ListenSocket = INVALID_SOCKET;
Chame a função de soquete e retorne seu valor para a variável ListenSocket. Para esse aplicativo de servidor, use o primeiro endereço IP retornado pela chamada para getaddrinfo que correspondeu à família de endereços, ao tipo de soquete e ao protocolo especificados no parâmetro hints . Neste exemplo, um soquete de fluxo TCP para IPv4 foi solicitado com uma família de endereços IPv4, um tipo de soquete de SOCK_STREAM e um protocolo de IPPROTO_TCP. Portanto, um endereço IPv4 é solicitado para o ListenSocket.
Se o aplicativo de servidor quiser escutar no IPv6, a família de endereços precisará ser definida como AF_INET6 no parâmetro hints . Se um servidor quiser escutar em IPv6 e IPv4, dois soquetes de escuta deverão ser criados, um para IPv6 e outro para IPv4. Esses dois soquetes devem ser manipulados separadamente pelo aplicativo.
O Windows Vista e posteriores oferecem a capacidade de criar um único soquete IPv6 que é colocado no modo de pilha dupla para escutar no IPv6 e no IPv4. Para obter mais informações sobre esse recurso, consulte 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);
Verifique se há erros para garantir que o soquete seja um soquete válido.
if (ListenSocket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; }
Próxima etapa: associar um soquete
Tópicos relacionados