Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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