Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Importante
Práticas recomendadas modernas do Winsock – siga estas diretrizes para o novo código:
-
Use o Winsock 2.2 — sempre solicite a versão 2.2 no WSAStartup. As funções winsock 1.1, como, por
gethostbynameexemplo, são preteridas e não têm suporte para IPv6. -
Use
getaddrinfopara resolução de nomes — a função getaddrinfo é independente de protocolo (dá suporte a IPv4 e IPv6). Nunca use o preteridogethostbynameougethostbyaddr. -
Escreva código pronto para IPv6 — use
AF_UNSPECcomgetaddrinfopara que seu código funcione tanto em IPv4 quanto em IPv6. Evite codificação rígidaAF_INET. Consulte o Guia IPv6 para Winsock. -
Gerencie a inicialização com RAII – em C++, encapsule
WSAStartup/WSACleanupem uma classe RAII ou use uma proteção de escopo para garantir a limpeza em todos os caminhos de saída (exceções, retornos antecipados). - Prefira E/S assíncrona – para aplicativos de servidor ou qualquer coisa que processe várias conexões, use portas de conclusão de E/S (maior desempenho) ou E/S sobreposta. Bloquear soquetes em um thread de interface do usuário congelará o aplicativo.
- Não se esqueça do tratamento de erros – verifique os valores retornados de todas as chamadas winsock e use WSAGetLastError para diagnóstico.
Erros comuns no código gerado por IA: esquecendo WSAStartup antes de qualquer chamada de soquete, usando gethostbyname em vez de getaddrinfocodificação AF_INET rígida (somente IPv4), usando loops de bloqueio recv/sendem threads de interface do usuário e não chamando freeaddrinfo depois.getaddrinfo
Esta seção é um guia passo a passo para começar a trabalhar com programação com Windows Sockets. Ele foi projetado para fornecer uma compreensão das funções básicas do Winsock e das estruturas de dados e como elas funcionam juntas.
O aplicativo cliente e servidor que usamos neste tópico para ilustração é um cliente e um servidor muito básicos. Exemplos de código mais avançados são incluídos nos exemplos incluídos no SDK (Software Development Kit) do Microsoft Windows.
As primeiras etapas são as mesmas para aplicativos cliente e servidor.
Os artigos a seguir descrevem as etapas restantes para criar um aplicativo cliente Winsock.
- Criando um soquete para o cliente
- Conectando-se a um soquete
- Enviar e receber dados no cliente
- Desconectando o cliente
Os artigos a seguir descrevem as etapas restantes para criar um aplicativo de servidor Winsock.
- Criando um soquete para o servidor
- Associar-se a um soquete
- Escutando em um soquete
- Aceitando uma conexão
- Recebendo e enviando dados no servidor
- Desconectando o servidor
O código-fonte completo para esses exemplos básicos.
- Executando o exemplo de código do servidor e do cliente Winsock
- Concluir o código do cliente Winsock
- Concluir o código do servidor Winsock
Aplicativos de exemplo avançados do Winsock
Há vários aplicativos de exemplo de cliente e servidor Winsock mais avançados disponíveis no GitHub. Eles estão listados aqui em ordem de desempenho superior a inferior e são encontrados nos seguintes diretórios:
iocp
Essa pasta contém três programas de exemplo que usam portas de conclusão de E/S. Os programas incluem: um servidor Winsock,
iocpserverque usa a função WSAAccept ; um servidor Winsock,iocpserverexque usa a função AcceptEx ; e um cliente Winsock multithreaded simples,iocpclientusado para testar qualquer um desses servidores.Os programas de servidor dão suporte a vários clientes que se conectam usando TCP/IP e enviam buffers de dados de tamanho arbitrário que o servidor então ecoa de volta para o cliente. Por conveniência, um programa cliente simples,
iocpclient, foi desenvolvido para se conectar e enviar continuamente dados ao servidor para estressá-lo usando vários threads. Os servidores Winsock que usam portas de conclusão de E/S fornecem o melhor desempenho.sobrepor
Esta pasta contém um programa de exemplo de servidor que usa E/S assíncrona. O programa de exemplo usa a função AcceptEx e a E/S sobreposta para lidar efetivamente com várias solicitações de conexão assíncronas de clientes. O servidor usa a função AcceptEx para multiplexar diferentes conexões de cliente em um aplicativo Win32 de thread único. O uso de E/S sobreposta permite maior escalabilidade.
WSAPoll
Esta pasta contém um programa de exemplo básico que demonstra o uso da função WSAPoll . O programa de cliente e servidor combinado não é bloqueado e usa a função WSAPoll para determinar quando é possível enviar ou receber sem bloqueio. Este exemplo é para ilustração e não é um servidor de alto desempenho.
simple
Esta pasta contém três programas de exemplo básicos que demonstram o uso de vários threads por um servidor. Os programas incluem: um servidor TCP/UDP simples,
simples; um servidor somente TCP,simples_ioctlque usa a função select em um aplicativo de console Win32 para dar suporte a várias solicitações de cliente; e um programa TCP/UDP cliente,simplecpara testar os servidores. Os servidores demonstram o uso de vários threads para lidar com várias solicitações de cliente. Esse método tem problemas de escalabilidade desde que um thread separado é criado para cada solicitação de cliente.aceitar
Esta pasta contém um servidor de exemplo básico e um programa cliente. O servidor demonstra o uso de aceitação sem bloqueio usando a função select ou aceita assíncrona usando a função WSAAsyncSelect . Este exemplo é para ilustração e não é um servidor de alto desempenho.