프로그래밍 노트

[winsock 초보 프로그래밍] 02 윈속 초기화 본문

통신관련

[winsock 초보 프로그래밍] 02 윈속 초기화

띠리 2007. 4. 16. 16:26
이 프로그램은 Win32콘솔 응용 프로그램으로 프로젝트를 만드는 것으로 한다.

-----------------------------------------------------------------------

윈속의 초기화

윈속의 초기화화 종료 처리

WSAStartup, WSACleanup

윈속의 기능을 이용하기 전에는 반드시 윈속의 초기화를 해야된다.
윈속의 초기화는 WSAStartup()으로 한다.
WSAStartup()은 처음에 한번만 호출하면된다.

윈속의 기능을 종료할때는 WSACleanup()으로 한다.
WSACleanup은 일반적으로 프로그램의 마지막이나 종료처리에서 실행된다.

======================================================================

#include <winsock2.h>



int main()

{

    int    nRet;


    // 윈속 초기화 정보 구조체

    WSADATA    wsaData;


    // 윈속 초기화

    nRet = WSAStartup(MAKEWORD(2,0), &wsaData);


    // 윈속 제거

    WSACleanup();


    return 0;

}


======================================================================

WSAStartup()은 두개의 인수가 있다.
첫번때 인수는 윈속의 버전을 지정한다.
위 소스에는 2.0을 쓰고 있다.

MAKEWORD는 2개의 인수를 WORD로 pack하는 매크로이다.
WORD는 16비트의 부호가 없는 변수로 WSAStartup()에서는 WORD의 16비트에서 상위 8비트에 Major번호 하위 8비트에 Minor번호를 넣어 넘겨주어야 한다.

WSAStartup()의 두번째 인수는 WSAStartup()이 초기화된 상태를 저장하는 변수를 넘겨준다.
WSAStartup()은 윈속을 초기화하고 초기화한 상태를 WSADATA구조체에 저장한다.


======================================================================

에러처리

WSAStartup()으로 초기화가 안될 때도 있다.
그러면 히루 윈속의 기능을 쓸수가 없기 때문에 WSAStartup()의 에러 처리는 매우 중요하다.
WSAStartup()이 성공하면 0을 반환한다.
이외의 값이 돌아올때는 초기화에 실패한 것이다.

======================================================================


#include <stdio.h>

#include <winsock2.h>


int main()

{

    int    nRet;


    // 윈속 초기화 정보 구조체

    WSADATA    wsaData;


    // 윈속 초기화

    nRet = WSAStartup(MAKEWORD(2,0), &wsaData);


    if(nRet != 0)

    {

        switch(nRet)

        {

            case WSASYSNOTREADY:

                printf("네트워크 접속을 준비 못함\");

                break;

            case WSAVERNOTSUPPORTED:

                printf("요구한 윈속 버전이 서포트 안됨\");

                break;

            case WSAEINPROGRESS:

                printf("블로킹 조작이 실행중\");

                break;

            case WSAEPROCLIM:

                printf("최대 윈속 프로세스 처리수 초과\");

                break;

            case WSAEFAULT:

                printf("두번째 인수의 포인터가 무효\");

                break;

        }

    }


    // 윈속 제거

    WSACleanup();


    return 0;

}


======================================================================

에러의 각 의미는 이하와 같다.

에러코드
WSASYSNOTREADY 네트워크 서브 시스템이 네트워크에 접속을 준비할 수 없음
WSAVERNOTSUPPORTED 요구한 윈속의 버전이 서포트 안됨
WSAEINPROGRESS 블로킹 윈도우 소켓이 실행중
WSAEPROCLIM 동시에 실행 가능한 최대 윈속수에 달했음
WSAEFAULT lpWSAData가 무효한 포인터임


에러의 내용은 그리 안중요할찌 모르지만 WSAStartup()이 문제없이 초기화되었는지는 반드시 확인해야된다.
Comments