본문 바로가기

[ Windows Program ]/Windows API

소켓 생성 함수 socket()

윈속을 초기화 한 뒤에는 소켓을 만들어야 한다.

이럴때 사용하는 함수가 바로 socket함수이다.

 

SOCKET socket( int af, int type, int protocol );

 

파라미터들

 

[입력] af

주소 패밀리(address family)를 적어준다.

인터넷을 사용한다면 예외없이 이 값은 AF_INET 이다.

 

[입력] type

어떤 소켓 타입을 사용할지를 적어준다. 이 값은 다음과 같이 크게 둘로 나뉜다

SOCK_STEAM - TCP방식을 사용한다

SOCK_DGRAM - UDP방식을 사용한다

 

[입력] protocol

이 값은 0으로 지정하면 저절로 그에 맞는 프로토콜을 사용하도록 한다.

자세한건 MSDN을 찾아보길 바랍니당~

 

 

리턴값

이 함수는 SOCKET이라는 데이터형을 리턴해준다. 우리는 이 소켓데이터를

잘 보관해 두었다가 잘 우려먹어야 할테니 전역 변수로 따로 넣어주는게 좋다.

소켓 생성에 실패한 경우에는 INVALID_SOCKET 이라는 값을 리턴하는데

이는 winsock헤더파일에 #define되어 있다. 리턴 값을 확인해 준 뒤에 실패한

경우에는 WSAGetLastError 함수로 에러에 대한 자세한 요인을 분석할 수 있다.

 

 

socket 함수와 반대되는 개념의 함수가 있는데 closesocket 함수이다.

 

closesocket( SOCKET s );

 

파라미터

[입력] s

socket함수가 리턴한 소켓값을 넣어준다.

 

 

이 함수는 socket함수로 생성한 소켓을 제거하는 용도로 사용되며

socket함수를 호출한만큼 실행시켜 주어야 한다.

 

 

 

아래는 소켓을 생성하는 간단한 프로그램 예제이다.

복잡한건 없고 단지 윈속을 초기화하고 새로운 소켓을 생성한뒤

생성한 소켓을 다시 제거시켜주고 윈속을 닫는 프로그램이다.

 

// ws2_32.lib 을 link해주어야 컴파일 에러가 나지 않는다

#include "stdio.h"

#include "sinsock2.h"

 

void main()

{

SOCKET s;

WORD wVersion = MAKEWORD(1, 1);

WSADATA wsaData;

 

// 윈속 초기화

if ( WSAStartup( wVersion, &wsaData ) != 0 ) {

printf( "WSAStartup() failed : %d", WSAGetLastError() );

return;

}

 

// 새로운 소켓 생성

s = socket( AF_INET, SOCK_STREAM, 0 );

if ( s == INVALID_SOCKET ) {

printf( "socket() failed : %d", WSAGetLastError() );

WSACleanup();

return;

}

 

printf( "새로운 소켓 생성 완료" );

closesocket( s );

WSACleanup();

}


- Reference

  http://cafe.naver.com/nevernding