sockaddr

Die Sockaddr-Struktur variiert je nach ausgewähltem Protokoll. Außer dem Sin*_family Parameter werden Sockaddr-Inhalte in Netzwerk-Bytereihenfolge ausgedrückt.

Winsock-Funktionen mit Sockaddr werden nicht streng interpretiert, um zeiger auf eine Sockaddr-Struktur zu zeigen. Die Struktur wird im Kontext unterschiedlicher Adressfamilien interpretiert. Die einzigen Anforderungen sind, dass die erste u_short die Adressfamilie ist und die Gesamtgröße des Speicherpuffers in Bytes Namelen ist.

Die SOCKADDR_STORAGE-Struktur speichert auch Socketadresseninformationen und die Struktur ist ausreichend groß, um IPv4- oder IPv6-Adressinformationen zu speichern. Die Verwendung der SOCKADDR_STORAGE Struktur fördert die Unabhängigkeit von Protokollfamilien und Protokollversionen und vereinfacht die Entwicklung. Es wird empfohlen, die SOCKADDR_STORAGE Struktur anstelle der Sockaddr-Struktur zu verwenden. Die SOCKADDR_STORAGE Struktur wird auf Windows Server 2003 und höher unterstützt.

Die sockaddr-Struktur und sockaddr_in strukturen unten werden mit IPv4 verwendet. Andere Protokolle verwenden ähnliche Strukturen.

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

Die folgenden sockaddr_in6 und sockaddr_in6_old Strukturen werden mit IPv6 verwendet.

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

Im Microsoft Windows Software Development Kit (SDK) veröffentlicht für Windows Vista und höher werden SOCKADDR- und SOCKADDR_IN Typedef-Tags für Sockaddr- und sockaddr_in Strukturen wie folgt definiert:

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;

Im Windows SDK, das für Windows Vista und höher veröffentlicht wurde, wurde die Organisation von Headerdateien geändert, und die Sockaddr- und sockaddr_in Strukturen werden in der Ws2def.h-Headerdatei definiert, nicht die Headerdatei Winsock2.h. Die Ws2def.h-Headerdatei wird automatisch von der Winsock2.h-Headerdatei eingeschlossen. Die sockaddr_in6-Struktur wird in der Ws2ipdef.h-Headerdatei definiert, nicht die Ws2tcpip.h-Headerdatei. Die Ws2ipdef.h-Headerdatei wird automatisch von der Ws2tcpip.h-Headerdatei enthalten. Die Ws2def.h- und Ws2ipdef.h-Kopfzeilendateien sollten nie direkt verwendet werden.

Beispielcode

Im folgenden Beispiel wird die Verwendung der Sockaddr-Struktur veranschaulicht.


// 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) );


Weitere Informationen

SOCKADDR_STORAGE