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 SDK(Windows 소프트웨어 개발 키트)에서 SOCKADDRSOCKADDR_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.hWs2ipdef.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