본문 바로가기

[ Windows Program ]/Windows API

윈속(WinSock)의 기초

윈속(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

  http://cafe.naver.com/nevernding