Compartir a través de


sockaddr

La estructura de sockaddr varía en función del protocolo seleccionado. Excepto para el parámetro sin*_family , el contenido de sockaddr se expresa en orden de bytes de red.

Las funciones winsock que usan sockaddr no se interpretan estrictamente como punteros a una estructura de sockaddr. La estructura se interpreta de forma diferente en el contexto de diferentes familias de direcciones. Los únicos requisitos son que el primer u_short es la familia de direcciones y el tamaño total del búfer de memoria en bytes es namelen.

La estructura de SOCKADDR_STORAGE también almacena la información de dirección del socket y la estructura es lo suficientemente grande como para almacenar información de direcciones IPv4 o IPv6. El uso de la estructura SOCKADDR_STORAGE promueve la independencia de la familia de protocolos y la versión de protocolo, y simplifica el desarrollo. Se recomienda usar la estructura SOCKADDR_STORAGE en lugar de la estructura sockaddr. La estructura de SOCKADDR_STORAGE se admite en Windows Server 2003 y versiones posteriores.

La estructura sockaddr y las estructuras de sockaddr_in siguientes se usan con IPv4. Otros protocolos usan estructuras similares.

struct sockaddr {
        ushort  sa_family;
        char    sa_data[14];
};

struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};

Las estructuras sockaddr_in6 y sockaddr_in6_old siguientes se usan con IPv6.

struct sockaddr_in6 {
        short   sin6_family;
        u_short sin6_port;
        u_long  sin6_flowinfo;
        struct  in6_addr sin6_addr;
        u_long  sin6_scope_id;
};

typedef struct sockaddr_in6 SOCKADDR_IN6;
typedef struct sockaddr_in6 *PSOCKADDR_IN6;
typedef struct sockaddr_in6 FAR *LPSOCKADDR_IN6;


struct sockaddr_in6_old {
        short   sin6_family;        
        u_short sin6_port;          
        u_long  sin6_flowinfo;      
        struct  in6_addr sin6_addr;  
};

En el Kit de desarrollo de software (SDK) de Microsoft Windows publicado para Windows Vista y versiones posteriores, las etiquetas typedef y soCKADDR y SOCKADDR_IN se definen para las estructuras sockaddr y sockaddr_in de la siguiente manera:

typedef struct sockaddr {
#if (_WIN32_WINNT < 0x0600)
    u_short sa_family;
#else 
    ADDRESS_FAMILY sa_family;
#endif //(_WIN32_WINNT < 0x0600)
    CHAR sa_data[14];
} SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;


typedef struct sockaddr_in {
#if(_WIN32_WINNT < 0x0600)
    short   sin_family;    
#else //(_WIN32_WINNT < 0x0600)
    ADDRESS_FAMILY sin_family;
#endif //(_WIN32_WINNT < 0x0600)
    USHORT sin_port;
    IN_ADDR sin_addr;
    CHAR sin_zero[8];
} SOCKADDR_IN, *PSOCKADDR_IN;

En windows SDK publicado para Windows Vista y versiones posteriores, la organización de archivos de encabezado ha cambiado y las estructuras de sockaddr y sockaddr_in se definen en el archivo de encabezado Ws2def.h , no en el archivo de encabezado Winsock2.h . El archivo de encabezado Ws2def.h se incluye automáticamente en el archivo de encabezado Winsock2.h . La estructura sockaddr_in6 se define en el archivo de encabezado Ws2ipdef.h , no en el archivo de encabezado Ws2tcpip.h . El archivo de encabezado Ws2ipdef.h se incluye automáticamente en el archivo de encabezado Ws2tcpip.h . Los archivos de encabezado Ws2def.h y Ws2ipdef.h nunca deben usarse directamente.

Código de ejemplo

En el ejemplo siguiente se muestra el uso de la estructura sockaddr .


// Declare variables
SOCKET ListenSocket;
struct sockaddr_in saServer;
hostent* localHost;
char* localIP;

// Create a listening socket
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

// Get the local host information
localHost = gethostbyname("");
localIP = inet_ntoa (*(struct in_addr *)*localHost->h_addr_list);

// Set up the sockaddr structure
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = inet_addr(localIP);
saServer.sin_port = htons(5150);

// Bind the listening socket using the
// information in the sockaddr structure
bind( ListenSocket,(SOCKADDR*) &saServer, sizeof(saServer) );


Consulte también

SOCKADDR_STORAGE