이번 단원에서는 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
'[ Windows Program ] > Windows API' 카테고리의 다른 글
주소할당 함수 bind의 사용 (0) | 2011.03.07 |
---|---|
주소 사용법( 주소체계, 바이트순서 ) (0) | 2011.03.07 |
소켓 프로그래밍 흐름도(클라이언트) (0) | 2011.03.07 |
소켓 프로그래밍 흐름도(서버) (0) | 2011.03.07 |
소켓 생성 함수 socket() (0) | 2011.03.07 |