윈속(Winsock)이란 윈도우용 소켓프로그래밍을 뜻하는 용어이며
유닉스의 BSD의 개념을 거의 그대로 적용한 인터페이스를 뜻합니다. 맞나?
개념적인것은 설명하지 않고 코딩쪽으로만 설명하겠습니다
이 윈속을 사용하기 위해선 먼저 ws2_32.dll 파일을 초기화 시켜줘야 합니다
이때 쓰이는 함수는 WSAStartup() 함수인데 앞으로 윈속을 사용할테니까
잘 좀 봐줘라~ 라는 의미로 애플리케이션 내에서 사용이 됩니다
함수 원형을 볼까요?
int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
);
두개의 인자를 받는군요
이 인자값엔 어떠한것들을 넣어줘야 하는지 알아보죠
[입력]wVersionRequested
사용할 윈속의 버젼값을 넣어줍니다
이때 MAKEWORD같은 매크로를 사용해서 넣어주면 편리하죠
가령 2.2의 버젼을 넣어준다면 MAKEWORD(2, 2) 이렇게 말이죠
[출력]lpWSAData
WSADATA 구조체의 포인터 주소를 넣어준다.
이 함수가 리턴될때 넣어준 WSADATA형 인자에 세부 정보들이 채워진다
이 함수가 정상적으로 수행되면 리턴값으로 zero를 반환하고
그렇지 않으면 0이 아닌 값을 반환한다.
간단히 WSAStartup()을 이용해 ws2_32.dll을 초기화 해보도록 하자
다시 말해주지만 이 함수를 호출해야 윈속관련 함수들을 사용할 수 있다
#include <stdio.h>
#include "winsock2.h"
void main()
{
WSADATA wsaData;
int iResult;
iResult = WSAStartup( MAKEWORD(2, 2), &wsaData );
// 에러 여부
if ( iResult == INVALID_SOCKET ) {
printf( "WSAStartup failed with error %d\n", iResult );
WSACleanup();
return;
}
// 정상적으로 WSAStartup이 수행되었다면 실행할 루틴들을 적어준다..
WSACleanup(); // 마지막엔 반드시 WSACleanup()을 호출해준다
}
자 별로 어렵지도 않다. 이렇게만 하면 우리는 소켓 프로그래밍할 준비가 된것이다
그런데 주의할 점이 있다. 저 프로그래밍 코드를 그대로 컴파일하면 에러가 뜰것이다
저 코드는 ws2_32.dll 을 초기화 해주는 루틴이기 때문에 ws2_32.lib 파일이 필요하다
당근 Alt + F7을 눌러서 ws2_32.lib파일을 링크시켜 주어야 한다
많은 분들이 이걸 빼먹는다고 하는데.. 전 그런 사람들을 본적이 없습니다
제 주변에 프로그래밍을 하는 사람은 저뿐이기 때문에요.
WSAStartup()을 수행한뒤엔 반드시 WSACleanup()을 호출해야 합니다
이 함수는 소켓을 써먹을 만큼 써먹었으니 이제 그만 쓰겠다~ 라고
명시해 주는 겁니다. 인자를 받지 않는 함수이며 WSAStartup()과는 반대되는 개념의
함수입니다. WSAStartup을 호출한만큼 WSACleanup을 호출해야 한다는 점만
주의하시면 됩니다.
- Reference
'[ Windows Program ] > Windows API' 카테고리의 다른 글
주소 사용법( 주소체계, 바이트순서 ) (0) | 2011.03.07 |
---|---|
주소 할당 함수 bind (0) | 2011.03.07 |
소켓 프로그래밍 흐름도(클라이언트) (0) | 2011.03.07 |
소켓 프로그래밍 흐름도(서버) (0) | 2011.03.07 |
소켓 생성 함수 socket() (0) | 2011.03.07 |