본문 바로가기

[ Windows Program ]/Windows API

주소 할당 함수 bind

이번 단원에서는 bind 함수에 대해 설명드리고자 합니다.

 

클라이언트가 서버에 접속하기 위해서는 어떤게 필요할까요? 쉽게 생각해보면 주소가 있어야 겠다는 생각이 들겁니다. 정확히 말하면 클라이언트가 어떤 특정 서버에 접속하기 위해선 그 서버의 IP주소와 port를 알아야 접속이 가능한 겁니다.

 

그럼 잠깐 생각해 볼까요? 우리는 어떻게 주소와 포트 번호로 서버에 접속을 할 수 있는걸까요? 그건 서버측에서 bind함수를 호출해 놓았기 때문입니다. 전에 '흐름도'단원에서 클라이언트가 접속할 수 있도록 주소를 할당한다고 했습니다. 이럴때 쓰이는게 bind함수지요. 만약 서버에서 211.108.23.xxx라는 IP주소와 27015라는 port번호를 bind시켜놓았다면 클라이언트가 그 서버로 접속하기 위해선 211.108.233.xxx와 27015라는 port번호만 알면 되는 겁니다.

왜냐? 서버측에서 주소를 그렇게 bind시켜 놓았으니까요. 설명이 조금 애매 하군요( 웃음 )

 

int  bind( SOCKET s, const struct sockaddr *name, int namelen );

 

이것은 bind함수의 함수형식 입니다. 총 3개의 파라미터를 받는군요. 알아볼까요?

 

s : 소켓을 받는 파라미터 입니다. socket함수로 소켓을 생성할때 SOCKET 구조체 값을 리턴한다고 했죠? 그 값을 넣어주면 됩니다.

 

name : sockaddr 이라는 구조체의 변수를 대입해 줍니다. sockaddr 구조체에 대해선 아직 언급하지 않았죠? sockaddr 구조체는 인터넷 기반의 프로토콜에선 잘 쓰이지 않는 구조체 입니다. 인터넷 기반에서는 sockaddr_in이라는 구조체를 사용하고 있죠. 편하거든요. 이 구조체들은 IP주소와 port번호, 그리고 주소 패밀리 라는것을 지정하는 구조체 입니다. 조금 뒤에서 다루도록 하죠.

 

namelen : 두번째 파라미터 name의 크기를 넣어줍니다.

 

 

리턴값 : 함수가 정상적으로 호출이 되지 않고 에러가 났을때는 SOCKET_ERROR 를 리턴합니다. 이는 winsock2.h에 상수로 정의되어 있습니다.

 

 

 

 

sockaddr 와 sockaddr_in 구조체에 대해

 

위의 두 구조체는 주소패밀리와 IP주소, 포트번호를 쉽게 입력하고 참조할 수 있도록 만들어진 구조체 입니다. 위에서 잠깐 언급했지만 sockaddr은 인터넷 기반에서 잘 쓰이지 않는 구조체라고 했습니다. 그에 비해 sockaddr_in구조체는 오로지 인터넷 기반에서만 쓰일 수 있는 구조체 입니다.

그래서 bind함수는 sockaddr_in 구조체를 파라미터로 받는게 아니라 sockaddr 구조체를 파라미터로 받는 겁니다. 인터넷 기반에서는 이를 적절히 캐스팅해서 사용하고 있지요.

 

그럼 우리가 알아볼것은 sockaddr_in 구조체 입니다. sockaddr 구조체는 다루지 않겠습니다.

 

struct sockaddr_in {

  short    sin_family;

  u_short    sin_port;

  struct in_addr    sin_addr;

  char    sin_zero[8];

}

 

sin_family : 프로토콜 체계(프로토콜 패밀리)를 정의 합니다.

인터넷 기반(IPv4)의 경우에는 여지없이 AF_INET 상수값을 넣어 줍니다.

 

sin_port : Port정보를 대입해 줍니다.

 

sin_addr : IP 주소 정보를 대입해 줍니다.

 

sin_zero : 특별한 의미 없이 sockaddr구조체와의 크기를 맞추기 위해 있는 멤버입니다.

이 값에는 어떠한 값도 쓰지 않습니다.

 

 

그런데 구조체를 잘 살펴보면 sin_addr 부분이 in_addr이라는 구조체로 되어 있는것을 알 수 있습니다. 이에 대해서는 다음에 자세히 언급하도록 하겠습니다. 우선은 bind의 사용법과 sockaddr_in의 구조체 멤버들이 어떠 어떠한게 있는지 알아두시기만 하면 됩니다.


- Reference

  http://cafe.naver.com/nevernding