sockaddr

La struttura sockaddr varia a seconda del protocollo selezionato. Ad eccezione del parametro sin*_family , il contenuto di sockaddr viene espresso in ordine di byte di rete.

Le funzioni Winsock che usano sockaddr non vengono interpretate esclusivamente come puntatori a una struttura sockaddr. La struttura viene interpretata in modo diverso nel contesto di diverse famiglie di indirizzi. Gli unici requisiti sono che il primo u_short è la famiglia di indirizzi e la dimensione totale del buffer di memoria in byte è namelen.

La struttura SOCKADDR_STORAGE archivia anche le informazioni sull'indirizzo del socket e la struttura è sufficientemente grande per archiviare le informazioni sugli indirizzi IPv4 o IPv6. L'uso della struttura SOCKADDR_STORAGE promuove l'indipendenza della famiglia di protocolli e della versione del protocollo e semplifica lo sviluppo. È consigliabile utilizzare la struttura SOCKADDR_STORAGE al posto della struttura sockaddr. La struttura SOCKADDR_STORAGE è supportata in Windows Server 2003 e versioni successive.

La struttura sockaddr e le strutture sockaddr_in seguenti vengono usate con IPv4. Altri protocolli usano strutture simili.

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

Le strutture sockaddr_in6 e sockaddr_in6_old seguenti vengono usate 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;  
};

In Microsoft Windows Software Development Kit (SDK) rilasciato per Windows Vista e versioni successive, SOCKADDR e i tag typedef SOCKADDR_IN sono definiti per sockaddr e sockaddr_in strutture come indicato di seguito:

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;

In Windows SDK rilasciato per Windows Vista e versioni successive, l'organizzazione dei file di intestazione è stata modificata e le strutture sockaddr e sockaddr_in sono definite nel file di intestazione Ws2def.h , non nel file di intestazione Winsock2.h . Il file di intestazione Ws2def.h viene incluso automaticamente dal file di intestazione Winsock2.h . La struttura sockaddr_in6 è definita nel file di intestazione Ws2ipdef.h , non nel file di intestazione Ws2tcpip.h . Il file di intestazione Ws2ipdef.h viene incluso automaticamente dal file di intestazione Ws2tcpip.h . I file di intestazione Ws2def.h e Ws2ipdef.h non devono mai essere usati direttamente.

Codice di esempio

Nell'esempio seguente viene illustrato l'uso della struttura 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) );


Vedere anche

SOCKADDR_STORAGE