sockaddr

La structure sockaddr varie en fonction du protocole sélectionné. À l’exception du paramètre sin*_family , les contenus sockaddr sont exprimés dans l’ordre d’octets réseau.

Les fonctions Winsock utilisant sockaddr ne sont pas strictement interprétées comme des pointeurs vers une structure sockaddr. La structure est interprétée différemment dans le contexte de différentes familles d’adresses. La seule exigence est que la première u_short est la famille d’adresses et la taille totale de la mémoire tampon en octets est namelen.

La structure SOCKADDR_STORAGE stocke également des informations d’adresse de socket et la structure est suffisamment grande pour stocker les informations d’adresse IPv4 ou IPv6. L’utilisation de la structure SOCKADDR_STORAGE favorise l’indépendance de la famille de protocoles et de la version de protocole, et simplifie le développement. Il est recommandé d’utiliser la structure SOCKADDR_STORAGE à la place de la structure sockaddr. La structure SOCKADDR_STORAGE est prise en charge sur Windows Server 2003 et versions ultérieures.

La structure sockaddr et les structures sockaddr_in ci-dessous sont utilisées avec IPv4. D’autres protocoles utilisent des structures similaires.

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

Les structures sockaddr_in6 et sockaddr_in6_old ci-dessous sont utilisées avec 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;  
};

Dans le Kit de développement logiciel (SDK) Microsoft Windows publié pour Windows Vista et versions ultérieures, les balises SOCKADDR et SOCKADDR_IN typedef sont définies pour les structures sockaddr et sockaddr_in comme suit :

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;

Sur le Kit de développement logiciel (SDK) Windows publié pour Windows Vista et versions ultérieures, la organization des fichiers d’en-tête a changé et les structures sockaddr et sockaddr_in sont définies dans le fichier d’en-tête Ws2def.h, et non dans le fichier d’en-tête Winsock2.h. Le fichier d’en-tête Ws2def.h est automatiquement inclus par le fichier d’en-tête Winsock2.h . La structure sockaddr_in6 est définie dans le fichier d’en-tête Ws2ipdef.h , et non dans le fichier d’en-tête Ws2tcpip.h . Le fichier d’en-tête Ws2ipdef.h est automatiquement inclus par le fichier d’en-tête Ws2tcpip.h . Les fichiers d’en-tête Ws2def.h et Ws2ipdef.h ne doivent jamais être utilisés directement.

Exemple de code

L’exemple suivant illustre l’utilisation de la structure 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) );


Voir aussi

SOCKADDR_STORAGE