Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
gethostbynameestán en desuso y carecen de compatibilidad con IPv6. -
Uso
getaddrinfopara la resolución de nombres : la función getaddrinfo es independiente del protocolo (admite IPv4 e IPv6). Nunca use el obsoletogethostbynameogethostbyaddr. -
Escribir código listo para IPv6 : use
AF_UNSPECcongetaddrinfopara que el código funcione tanto en IPv4 como en IPv6. Evite codificarAF_INETde forma rígida . Consulte guía de IPv6 para Winsock. -
Administrar la inicialización con RAII: en C++, envuelve
WSAStartup/WSACleanupen 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.
- Acerca de los servidores y clientes
- Creación de una aplicación básica de Winsock
- Inicializando Winsock
En los artículos siguientes se describen los pasos restantes para crear una aplicación cliente de Winsock.
- Creación de un socket para el cliente
- Conexión a un socket
- Envío y recepción de datos en el cliente
- Desconectar el cliente
En los artículos siguientes se describen los pasos restantes para crear una aplicación de servidor Winsock.
- Creación de un socket para el servidor
- Enlace de un socket
- Escucha en un socket
- Aceptación de una conexión
- Recepción y envío de datos en el servidor
- Desconectar el servidor
Código fuente completo para estos ejemplos básicos.
- Ejecución del ejemplo de código de servidor y cliente de Winsock
- Completar el código de cliente de Winsock
- Código completo del servidor winsock
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.