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.
En las aplicaciones Winsock, los códigos de error se recuperan mediante la función WSAGetLastError, que es el sustituto de Windows Sockets para la función GetLastError de Windows. Los códigos de error devueltos por Windows Sockets son similares a las constantes de código de error del socket UNIX, pero todas las constantes tienen el prefijo WSA. Por lo tanto, en las aplicaciones winsock, se devolvería el código de error WSAEWOULDBLOCK, mientras que en las aplicaciones UNIX se devolvería el código de error EWOULDBLOCK.
Los códigos de error establecidos por Windows Sockets no están disponibles a través de la variable errno. Además, para el getXbyY clase de funciones, los códigos de error no están disponibles a través de la variable h_errno. La función WSAGetLastError está diseñada para proporcionar una manera confiable de que un subproceso dentro de un proceso con múltiples hilos obtenga información de error específica por subproceso.
Por motivos de compatibilidad con Berkeley UNIX (BSD), las primeras versiones de Windows (Windows 95 con la actualización de Windows Socket 2 y Windows 98, por ejemplo) redefiniron las constantes de error normales de Berkeley normalmente encontradas en errno.h en BSD como errores de WSA de Windows Sockets equivalentes. Por ejemplo, ECONNREFUSED se definió como WSAECONNREFUSED en el archivo de encabezado Winsock.h. En versiones posteriores de Windows (Windows NT 3.1 y versiones posteriores), estas definiciones se comentaron para evitar conflictos con errno.h usado con Microsoft C/C++ y Visual Studio.
El archivo de encabezado Winsock2.h incluido con el Kit de desarrollo de software (SDK) de Microsoft Windows, el Kit de desarrollo de software de plataforma (SDK) y Visual Studio todavía contiene un bloque de definición comentado dentro de un bloque #ifdef 0 y #endif que definen los códigos de error del socket BSD para que sean iguales que las constantes de error de WSA. Se pueden usar para proporcionar cierta compatibilidad con la programación de sockets UNIX, BSD y Linux. Para la compatibilidad con BSD, una aplicación puede optar por cambiar el Winsock2.h y descomentar este bloque. Sin embargo, se desaconseja encarecidamente a los desarrolladores de aplicaciones descomentar este bloque debido a conflictos inevitables con errno.h en la mayoría de las aplicaciones. Además, los errores de socket BSD se definen en valores muy diferentes de los que se usan en programas UNIX, BSD y Linux. Se recomienda encarecidamente a los desarrolladores de aplicaciones usar las constantes de error WSA en las aplicaciones de socket.
Estas definiciones permanecen comentadas en el encabezado Winsock2.h dentro de un bloque #ifdef 0 y #endif. Si un desarrollador de aplicaciones insiste en usar los códigos de error BSD para la compatibilidad, una aplicación puede optar por incluir una línea del formulario:
#include <windows.h>
#define errno WSAGetLastError()
Esto permite que el código de red, que fue escrito para utilizar el global errno, funcione correctamente en un entorno de un solo hilo. Hay algunas desventajas muy graves. Si un archivo de código fuente incluye código que inspecciona errno para las funciones de socket y las funciones no relacionadas con sockets, no se puede usar este mecanismo. Además, no es posible que una aplicación asigne un nuevo valor a errno. (En Windows Sockets, la función WSASetLastError se puede usar para este fin).
Estilo típico de BSD
r = recv(...);
if (r == -1
&& errno == EWOULDBLOCK)
{...}
Estilo preferido
r = recv(...);
if (r == -1 /* (but see below) */
&& WSAGetLastError() == EWOULDBLOCK)
{...}
Los estilos anteriores necesitan la redefinición de las constantes de error de socket BSD a constantes de error de WSA para que funcionen correctamente. Aunque las constantes de error coherentes con Berkeley Sockets 4.3 se proporcionan con fines de compatibilidad, se recomienda encarecidamente que las aplicaciones usen las definiciones de código de error de WSA. Esto se debe a que los códigos de error devueltos por determinadas funciones de Windows Sockets se encuentran en el intervalo estándar de códigos de error definidos por Microsoft C©. Por lo tanto, una versión mejor del fragmento de código fuente anterior es:
r = recv(...);
if (r == -1 /* (but see below) */
&& WSAGetLastError() == WSAEWOULDBLOCK)
{...}
La especificación original winsock 1.1 definida en 1995 recomendó un conjunto de códigos de error y enumeraba los posibles errores que se pueden devolver como resultado de cada función. Windows Sockets 2 agregó funciones y características, y se devolvieron otros códigos de error de Windows Sockets, además de los enumerados en la especificación original de Winsock. Se han agregado funciones adicionales a lo largo del tiempo para mejorar Winsock para su uso por parte de los desarrolladores. Por ejemplo, se agregaron nuevas funciones de servicio de nombre (getaddrinfo y getnameinfo, por ejemplo) que admiten IPv6 e IPv4 en Windows XP y versiones posteriores. Algunas de las antiguas funciones de servicio de nombres de solo IPv4 (las funciones de la clase getXbyY, por ejemplo) han quedado en desuso.
En la sección sobre Códigos de Error de Windows Socketsse ofrece una lista completa de los posibles códigos de error devueltos por las funciones de Windows Sockets.
Temas relacionados