Introducción a Winsock

Importante

Procedimientos recomendados modernos de Winsock : siga estas instrucciones para el nuevo código:

  • Use Winsock 2.2 : solicite siempre la versión 2.2 en WSAStartup. Las funciones de Winsock 1.1 como gethostbyname están en desuso y carecen de compatibilidad con IPv6.
  • Uso getaddrinfo para la resolución de nombres : la función getaddrinfo es independiente del protocolo (admite IPv4 e IPv6). Nunca use el obsoleto gethostbyname o gethostbyaddr.
  • Escribir código listo para IPv6 : use AF_UNSPEC con getaddrinfo para que el código funcione tanto en IPv4 como en IPv6. Evite codificar AF_INETde forma rígida . Consulte guía de IPv6 para Winsock.
  • Administrar la inicialización con RAII: en C++, envuelve WSAStartup/WSACleanup en una clase RAII o utiliza un scope guard para garantizar la limpieza en todas las rutas de salida (excepciones, retornos anticipados).
  • Preferir E/S asincrónica: para aplicaciones de servidor o cualquier cosa que controle varias conexiones, use puertos de finalización de E/S (rendimiento más alto) o E/S superpuestas. Los sockets bloqueantes en un hilo de la interfaz de usuario congelarán la aplicación.
  • No olvide el control de errores : compruebe los valores devueltos de todas las llamadas de Winsock y use WSAGetLastError para diagnósticos.

Errores comunes en el código generado por IA: olvidar WSAStartup antes de cualquier llamada a socket, usar gethostbyname en lugar de getaddrinfo, codificar AF_INET de forma fija (solo IPv4), usar bucles bloqueantes recv/send en hilos de la interfaz de usuario y no llamar a freeaddrinfo después de getaddrinfo.

Esta sección es una guía paso a paso para empezar a trabajar con la programación de sockets de Windows. Está diseñado para proporcionar una comprensión de las funciones básicas de Winsock y las estructuras de datos, y cómo funcionan conjuntamente.

La aplicación cliente y servidor que usamos en este tema para la ilustración es un cliente y servidor muy básico. Los ejemplos de código más avanzados se incluyen en los ejemplos incluidos con el kit de desarrollo de software (SDK) de Microsoft Windows.

Los primeros pasos son los mismos para las aplicaciones cliente y servidor.

En los artículos siguientes se describen los pasos restantes para crear una aplicación cliente de Winsock.

En los artículos siguientes se describen los pasos restantes para crear una aplicación de servidor Winsock.

Código fuente completo para estos ejemplos básicos.

Aplicaciones de ejemplo avanzadas de Winsock

Hay disponibles varias aplicaciones de ejemplo de servidor y cliente de Winsock más avanzadas en GitHub. Se enumeran aquí en orden de mayor a menor rendimiento y se encuentran en los directorios siguientes:

  • iocp

    Esa carpeta contiene tres programas de ejemplo que usan puertos de finalización de E/S. Los programas incluyen: un servidor Winsock, iocpserver, que usa la función WSAAccept ; un servidor Winsock, iocpserverex, que usa la función AcceptEx y un cliente simple de Winsock multiproceso, , iocpclientque se usa para probar cualquiera de estos servidores.

    Los programas de servidor admiten la conexión de varios clientes mediante TCP/IP y el envío de búferes de datos de tamaño arbitrario que el servidor devuelve al cliente. Por comodidad, se desarrolló un programa cliente sencillo, iocpclient, para conectarse al servidor y enviarle datos continuamente a fin de someterlo a carga utilizando múltiples subprocesos. Los servidores Winsock que usan puertos de finalización de E/S proporcionan el máximo rendimiento.

  • superposición

    Esta carpeta contiene un programa de servidor de ejemplo que usa E/S superpuesta. El programa de ejemplo usa la función AcceptEx y la E/S superpuesta para controlar eficazmente varias solicitudes de conexión asincrónicas de los clientes. El servidor usa la función AcceptEx para multiplexar distintas conexiones de clientes en una aplicación Win32 de un solo hilo. El uso de E/S superpuesta permite una mayor escalabilidad.

  • WSAPoll

    Esta carpeta contiene un programa de ejemplo básico que muestra el uso de la función WSAPoll . El programa de servidor y el cliente combinados no están bloqueados y usan la función WSAPoll para determinar cuándo es posible enviar o recibir sin bloqueo. Este ejemplo es para ilustración y no es un servidor de alto rendimiento.

  • simple

    Esta carpeta contiene tres programas de ejemplo básicos que muestran el uso de varios subprocesos por un servidor. Los programas incluyen: un servidor TCP/UDP simple, simples; un servidor de solo TCP, simples_ioctl, que usa la función select en una aplicación de consola Win32 para admitir varias solicitudes de cliente; y un programa TCP/UDP de cliente, simplec, para probar los servidores. Los servidores muestran el uso de varios subprocesos para controlar varias solicitudes de cliente. Ese método tiene problemas de escalabilidad, ya que se crea un subproceso independiente para cada solicitud de cliente.

  • aceptar

    Esta carpeta contiene un programa cliente y servidor de ejemplo básico. El servidor muestra el uso de aceptación sin bloqueo mediante la función select o la aceptación asincrónica mediante la función WSAAsyncSelect . Este ejemplo es para ilustración y no es un servidor de alto rendimiento.