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


参照

SOCKADDR_STORAGE