Share via


Tipo de datos socket

En las aplicaciones winsock, un descriptor de socket no es un descriptor de archivo y debe usarse con las funciones winsock.

En UNIX, un descriptor de socket se representa mediante un descriptor de archivo estándar. Como resultado, se puede pasar un descriptor de socket en UNIX a cualquiera de las funciones de E/S de archivo estándar (lectura y escritura, por ejemplo).

Además, todos los identificadores de UNIX, incluidos los identificadores de socket, son enteros pequeños, no negativos y algunas aplicaciones hacen suposiciones de que esto será cierto.

Los identificadores de Windows Socket no tienen restricciones, aparte de que el valor INVALID_SOCKET no es un socket válido. Los identificadores de socket pueden tomar cualquier valor del intervalo 0 a INVALID_SOCKET–1.

Dado que el tipo SOCKET no está firmado, compilar código fuente existente a partir de, por ejemplo, un entorno UNIX puede provocar advertencias del compilador sobre las discrepancias de tipos de datos firmados o sin firmar.

Esto significa, por ejemplo, que la comprobación de errores cuando las funciones socket y accept no deben realizarse comparando el valor devuelto con –1, o viendo si el valor es negativo (enfoques comunes y legales en UNIX). En su lugar, una aplicación debe usar la constante de manifiesto INVALID_SOCKET tal como se define en el archivo de encabezado Winsock2.h . Por ejemplo:

Estilo típico de UNIX de BSD

s = socket(...);
if (s == -1)    /* or s < 0 */
    {/*...*/}

Estilo preferido

s = socket(...);
if (s == INVALID_SOCKET)
    {/*...*/}

Portabilidad de aplicaciones de socket a Winsock

Consideraciones de programación de Winsock