Sockaddr
sockaddr 構造体は、選択したプロトコルによって異なります。 sin*_family パラメーターを除き、sockaddr の内容はネットワークのバイト順で表されます。
sockaddr を使用する Winsock 関数は、厳密には sockaddr 構造体へのポインターとして解釈されません。 構造は、異なるアドレス ファミリのコンテキストで異なる方法で解釈されます。 唯一の要件は、最初の u_short はアドレス ファミリであり、メモリ バッファーの合計サイズ (バイト単位) は namelen です。
SOCKADDR_STORAGE構造体にはソケット アドレス情報も格納され、構造体は IPv4 または IPv6 アドレス情報を格納するのに十分な大きさです。 SOCKADDR_STORAGE構造を使用すると、プロトコル ファミリとプロトコル バージョンの独立が促進され、開発が簡略化されます。 sockaddr 構造体の代わりに 、SOCKADDR_STORAGE 構造体を使用することをお勧めします。 SOCKADDR_STORAGE構造は、Windows Server 2003 以降でサポートされています。
以下の sockaddr 構造体とsockaddr_in構造体は、IPv4 と共に使用されます。 他のプロトコルでは、同様の構造が使用されます。
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];
};
以下のsockaddr_in6およびsockaddr_in6_old構造体は、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;
};
Windows Vista 以降用にリリースされた Microsoft Windows ソフトウェア開発キット (SDK) では、 SOCKADDR タグと SOCKADDR_IN typedef タグは、sockaddr および sockaddr_in 構造体に対して次のように定義されています。
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;
Windows Vista 以降用にリリースされた Windows SDK では、ヘッダー ファイルのorganizationが変更され、sockaddr および sockaddr_in 構造体は、Winsock2.h ヘッダー ファイルではなく Ws2def.h ヘッダー ファイルで定義されます。 Ws2def.h ヘッダー ファイルは、Winsock2.h ヘッダー ファイルによって自動的に含まれます。 sockaddr_in6構造体は 、Ws2tcpip.h ヘッダー ファイルではなく、 Ws2ipdef.h ヘッダー ファイルで定義されます。 Ws2ipdef.h ヘッダー ファイルは、Ws2tcpip.h ヘッダー ファイルによって自動的に含まれます。 Ws2def.h ヘッダー ファイルと Ws2ipdef.h ヘッダー ファイルを直接使用しないでください。
次の例では、 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) );