Sockaddr

A estrutura sockaddr varia dependendo do protocolo selecionado. Exceto pelo parâmetro sin*_family , o conteúdo sockaddr é expresso na ordem de bytes de rede.

As funções Winsock que usam sockaddr não são estritamente interpretadas como ponteiros para uma estrutura sockaddr. A estrutura é interpretada de forma diferente no contexto de diferentes famílias de endereços. Os únicos requisitos são que o primeiro u_short seja a família de endereços e o tamanho total do buffer de memória em bytes seja namelen.

A estrutura SOCKADDR_STORAGE também armazena informações de endereço de soquete e a estrutura é suficientemente grande para armazenar informações de endereço IPv4 ou IPv6. O uso da estrutura SOCKADDR_STORAGE promove a independência da família de protocolos e da versão do protocolo e simplifica o desenvolvimento. É recomendável que a estrutura SOCKADDR_STORAGE seja usada no lugar da estrutura sockaddr. A estrutura SOCKADDR_STORAGE tem suporte no Windows Server 2003 e posterior.

A estrutura sockaddr e as estruturas de sockaddr_in abaixo são usadas com IPv4. Outros protocolos usam estruturas semelhantes.

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];
};

As estruturas sockaddr_in6 e sockaddr_in6_old abaixo são usadas com 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;  
};

No Microsoft Windows Software Development Kit (SDK) lançado para Windows Vista e posterior, as marcas SOCKADDR e SOCKADDR_IN typedef são definidas para estruturas sockaddr e sockaddr_in da seguinte maneira:

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;

No SDK do Windows lançado para Windows Vista e posterior, a organização dos arquivos de cabeçalho foi alterada e as estruturas sockaddr e sockaddr_in são definidas no arquivo de cabeçalho Ws2def.h , não no arquivo de cabeçalho Winsock2.h . O arquivo de cabeçalho Ws2def.h é incluído automaticamente pelo arquivo de cabeçalho Winsock2.h . A estrutura sockaddr_in6 é definida no arquivo de cabeçalho Ws2ipdef.h , não no arquivo de cabeçalho Ws2tcpip.h . O arquivo de cabeçalho Ws2ipdef.h é incluído automaticamente pelo arquivo de cabeçalho Ws2tcpip.h . Os arquivos de cabeçalho Ws2def.h e Ws2ipdef.h nunca devem ser usados diretamente.

Código de exemplo

O exemplo a seguir demonstra o uso da estrutura 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 Também

SOCKADDR_STORAGE