리셋 되지 말자

[windows] WORD, LPWSADATA 본문

socket

[windows] WORD, LPWSADATA

kyeongjun-dev 2020. 4. 3. 18:25

WSAStartup(WORD wVersionRequested, LPWSADATA ipWSAData);

 

윈도우 소켓에는 몇몇 버전이 존재한다. 따라서 사용할 소켓의 버전정보를 WORD혀으로 구성해서 (WORD는 typedef 선언을 통해서 unsigned short로 정의 되어 있다.) 위 함수의 첫 번째 매개변수 wVersionRequested로 전달 해야 한다. 소켓의 버전이 1.2라면, 1이 주 버전이고 2가 부 버전이므로 0x0201을 인자로 전달 해야 한다.

 

이렇게 상위 8비트에는 부 버전정보를, 하위 8비트에는 주 버전 정보를 표시해서 인자로 전달하게 된다. 바이트 단위로 쪼개서 버전정보를 설정하는 것이 번거로운데, 이를 위해 매크로 함수인 MAKEWORD가 제공된다. 이 함수를 사용하면 다음과 같이 간단히 WORD형 버전정보를구성할 수 있다.

 

MAKEWORD(1, 2);	//주 부전1, 부 버전 2, 0x0201 반환
MAKEWORD(2, 2);	//주 버전 2, 부 버전 2, 0x0202 반환

 

두 번째 매개변수에는 WSADATA 구조체 변수의 주소 값을 인자로 전달해야 한다. (LPWSADATA는 WSADATA의 포인터 형이다.) 그러면 함수호출이 완료되고 난 다음에 해당 변수에는 초기화된 라이브러리의 정보가 채워진다. 특별히 큰 의미를 지니지는 않지만, 함수호출을 위해서는 반드시 WSADATA 구조체 변수의 주소 값을 전달해야 한다. 그럼 코드의 앞부분에 등장하는 WSAStartup함수의 호출과정을 간단히 보이겠다. 참고로 아래의 코드는 윈도우 소켓 기반의 프로그래밍에서는 거의 공식과 같이 등장한다.

 

int main(int argc, char* argv[]){
	WSADATA wsaData;
    //. . . .
    if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    	ErrorHandling("WSAStartup() error!");
    //....
    return 0;
}

 

초기화 방법은 위와 같이 하면 되고, 초기화된 라이브러리의 해제 방법은 아래의 함수를 이용한다.

#include<WinSock2.h>

int WSACleanup(void);
//성공 시 0, 실패 시 SOCKET_ERROR 반환
//위 함수를 호출하면, 할달된 윈도우 소켓 라이브러리는 윈도우 운영체제에서 반환이 되어 윈도우 소켓
//관련 함수의 호출이 불가능해진다. 따라서 더 이상 윈도우 소켓 관련 함수의 호출이 불필요할 때,
//위 함수를 호출하는 것이 원칙이나 프로그래임 종료되기 직전에 호출하는 것이 보통이다.
Comments