listen(2)
소켓(:12)의 연결 대기열(:12)을 만든다.
사용법
#include <sys/socket.h>
int listen(int sockfd, int backlog);
설명
서버 프로그램은 socket(2)함수를 이용해서 클라이언트(의 연결을 받아들일 소켓을 만들게 된다. 클라이언트의 연결은 listen소켓을 통해서 이루어진다. 클라이언트는 connect(2)를 호출해서 서버에 연결을 시도하고, 3HSK이 성공하면 서버와 완전한 연결이 만들어 진다.
만들어진 연결은 queue에 들어가게 된다.
listen(2) 시스템콜은 SOCK_STREAM과 SOCK_SEQPACKET에만 사용된다. (== TCP, SCTP)
sockfd는 앞서 bind() 함수를 통해 바인딩 된 소켓의 소켓 디크립터이다.
backlog는 연결이 대기할 수 있는 큐의 갯수이다. 0으로 하면 default값 이 설정된다.
반환값
성공하면 0을 리턴하고 실패했을 경우 -1을 리턴하고 errno 를 설정한다.
backlog란?
커널은 listen 소켓을 위한 두가지 큐를 가지고 있다. backlog는 아래 두가지 큐의 합에 대한 최대값을 규정한다.
- 불완전 연결 큐
- 완전 연결 큐
1. 불완전 연결 큐
- 클라이언트가 3HSK를 맺기위해 보낸 SYN 패킷을 저장하는 큐이다.
- 소켓의 상태 : (연결 진행 중) SYN_RCVD
2. 완전 연결 큐
- 3HSK가 맺어진상태의 클라이언트 항목을 저장하는 큐이다.
- 소켓의 상태 : (완전히 연결 됨) ESTABLISHED
- accept가 되면 완전 연결 큐에 있는 첫번째 엔트리의 소켓이 반환된다.
*** 서버는 listen queue가 full일때 SYN이 와도 RST 보내지 않음. client program이 에러를 만나지 않고 다시 SYN를 재전송 하였을 때, 시간이 흐른 뒤에는 listen queue full 상황이 풀려 정상적으로 connection 연결이 될 수도 있기 때문이다
참고링크
'네트워크 > MAN Page' 카테고리의 다른 글
[unistd.h]fork(2) (0) | 2020.10.13 |
---|---|
[sys/socket.h] accept(2) (0) | 2020.09.23 |
[sys/socket.h] bind(2) (0) | 2020.09.23 |
[sys/socket.h] connect(2) (0) | 2020.09.23 |
[sys/socket.h] socket(2) (0) | 2020.09.23 |