'listen()'에 해당되는 글 1건

  1. 2009.12.16 listen() and accept()
2009. 12. 16. 09:30

listen() and accept()



socket() 함수를 통해 통신을 위한 소켓을 생성하고, bind() 함수를 통해 소켓에 주소를 할당 한 다음 해야할 일은 어디선가로 부터의 통신 연결 요청에 대해 대기하고 있어야 한다.
이 때 연결 요청 대기상태로 만들어주는 함수가 'listen()' 함수이다.

#include <sys/types.h>

int listen (int s, int backlog);

s - 연결 요청을 받아들일 소켓의 파일 디스크립터(서버 소켓)
backlog - 연결 요청 대기 큐의 크기
리턴값 - 성공 시 0, 실패 시 -1을 리턴

listen() 함수는 SOCK_STREAM과 SOCK_SEQPACKET 에만 사용된다.


실제 네트워크 상에서 소켓을 이용한 통신이 이루어지는 순서를 보자.

'서버측'의 프로그램은 socket() 함수를 통해 통신을 위한 소켓을 하나 생성한다. 이는 클라이언트의 연결을 받아들이기 위한 용도로 사용된다. 주소정보를 sockaddr_in 구조체에 채워 넣은 후 bind() 함수를 사용해 소켓에 서버측 프로그램의 주소정보를 할당한다. 그리고 클라이언트의 연결 요청이 있기 전까지 서버측의 프로그램은 listen() 함수를 통해 응답 요청에 대한 대기상태로 들어간다.

'클라이언트측'의 프로그램은 socket() 함수를 통해 통신을 위한 소켓을 생성하고, connect() 함수를 통해 서버측 프로그램에 연결을 요청한다. 이러한 클라이언트 프로그램의 요청에 대해 서버측 프로그램은 backlog 크기의 연결 요청 대기 큐에 클라이언트측 프로그램의 요청을 밀어넣고, accept() 함수를 사용하여 클라이언트측 프로그램과 연결을 하고 통신을 하게 된다.
backlog는 최대 접속할 수 있는 클라이언트의 수를 의미한다. backlog를 5로 설정했을 때 연결 요청 대기 큐에는 5개 까지의 클라이언트 프로그램의 요청이 들어갈 수 있다.

이때 서버측 프로그램은 새로이 소켓을 하나 생성하게 된다.
처음 만들어진 소켓은 통신을 위해 클라이언트 측의 요청을 대기하기 위한 용도의 소켓이고, accept() 시 생성되는 소켓은 클라이언트와 실제 데이터를 주고 받는 통신을 하기 위해 사용되는 용도의 소켓이다.

다음은 'accept()' 함수의 프로토타입이다.

#include <sys/types.h>
#include <sys/socket.h>

int accept (int s, struct sockaddr *addr, int *addrlen);

s - 연결 요청을 받아들일 소켓의 파일 디스크립터(서버 소켓)
addr - 연결 요청을 수락할 클라이언트측 프로그램의 주소정보를 가진 변수의 포인터
addrlen - 두번째 인자 addr 포인터가 가리키는 구조체의 크기
리턴값 - 성공 시 클라이언트와 데이터를 주고받기 위해 사용될 소켓의 파일 디스크립터, 실패 시 -1

accept() 함수는 연결지향 소켓타입 (SOCK_STREAM, SOCK_SEQPACKET, SOCK_RDM)에 사용된다.

'Programmings > TCP/IP socket programming' 카테고리의 다른 글

connect()  (0) 2009.12.18
bind()  (0) 2009.12.15
socket()  (0) 2009.12.15