2. 1 윈속 초기화 [TCP/IP 소켓 프로그래밍 with 윈도우즈]

윈속을 사용하려면 먼저 WinSock2.h 파일을 포함하고 ws2_32.dll을 동적 링크하여야 합니다.

#include <WinSock2.h>
#pragma comment(lib,"ws2_32")

그리고 윈속을 사용하려면 초기화 과정을 거쳐야 합니다. 그리고 더 이상 윈속을 사용하지 않을 때 이를 해제화합니다. 따라서 윈속을 이용하는 응용 프로그램의 시작 위치에 윈속 초기화를 수행하고 프로그램이 끝나기 전에 해제화를 수행합니다.

int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);
wVersionRequested: 사용할 윈속 버전으로 상위 2바이트에는 주 버전 번호 하위 2바이트에는 부 버전 번호
                   만약 2.2 버전을 사용하려면 0x0202 혹은 매크로 함수를 이용하여 MAKEWORD(2,2)
lpWSAData: 초기화 과정에서 윈속의 속성을 설정에 필요, 함수 내부에서 설정해 준다.
int WSACleanup(void);
typedef struct WSAData {
    WORD                wVersion; // 버전
    WORD                wHighVersion; //사용할 수 있는 상위 버전으로 wVersion과 일치한다.
    char                   szDescription[WSADESCRIPTION_LEN+1]; //윈속 설명
    char                   szSystemStatus[WSASYS_STATUS_LEN+1]; //상태 문자열
    unsigned short     iMaxSockets; //최대 소켓 
    unsigned short     iMaxUdpDg; //데이터 그램의 최대 크기
    char FAR *           lpVendorInfo; //벤더 정보( 큰 의미 없음)
#endif
} WSADATA, FAR * LPWSADATA;

윈속을 초기화할 때 WSADATA 형식 변수의 주소를 전달하며 초기화 함수 내부에서 윈속의 속성 정보로 설정해 줍니다. 하지만 실제 값을 확인해 보면 별다른 내용도 없으며 소켓 프로그래밍에서 이를 활용할 필요도 없습니다. 이러한 멤버가 남아있는 것은 하위버전과의 호환성을 위해서 남아있는 것입니다.

//윈속 초기화 및 해제
#include <WinSock2.h>//윈속 헤더파일 포함문
#include <stdio.h>
#pragma comment(lib,"ws2_32")//윈속 라이브러리 참조
int main()
{
    WSADATA wsadata;
    WSAStartup(MAKEWORD(2,2),&wsadata);//윈속 초기화
    
    printf("wHighVersion:%#x\n",wsadata.wHighVersion);//윈속상위버전
    printf("wVersion:%#x\n",wsadata.wVersion);//윈속버전
    printf("szDescription:%s\n",wsadata.szDescription);//윈속 설명
    printf("szSystemStatus:%s\n",wsadata.szSystemStatus);//윈속상태

    //의미상으로 최대 소켓 개수이나 확인해 보면 언제나 0(하위버전과 호환성을 위해 남겨둠)
    printf("iMaxSocket:%d\n",wsadata.iMaxSockets);
    //의미상으로 데이터 그램의 최대 크기이나 확인해 보면 언제나 0(하위버전과 호환성을 위해 남겨둠)
    printf("iMaxUdpDg:%d\n",wsadata.iMaxUdpDg);
    
    WSACleanup();//윈속 해제
	return 0;
}

실행 결과

wHighVersion:0x0202
wVersion:0x0202
szDescription:WinSock 2.0
szSystemStatus:Running
iMaxSocket:0
iMaxUdpDg:0