listen( )의 역할은,바인딩된서버 소켓(Server Socket)으로 수신될외부 클라이언트의 connect( ) 요청을 대기하며, 연결 요청을 수신 받으면 해당 "클라이언트정보"를 시스템 내부 큐(Queue)에 쌓는다.수신 성공(0) 시점에서 서버와 클라이언트는 아직 연결되지 않은 상태다.
listen( )이 성공하더라도, 리턴 값에 클라이언트의 요청에 대한 정보는 들어 있지 않으며 접근도 불가능하다.
리턴 값으로 판단할 수 있는 것은 클라이언트 연결 요청을 잘 수신하여 내부에 저장하였는지(0), 그렇지 않고 에러가 발생했는지(-1) 뿐이다.
int listen(int sockfd, int backlog);
// 성공시 0, 실패시 -1
4. 서버와 클라이언트 연결 수립
accept( ) 실행 이후에 실질적인 클라이언트-서버 연결(Connection)이 이루어진다.
주의할 점은 accept( )를 통해 생성된 소켓의 파일 디스크립터는, 앞서 bind( )와 listen( )에 사용된 서버 소켓(Server Socket)이 아니다.
accept( ) 내부에서 서버 소켓(Server Socket)과 클라이언트 소켓(Client Socket)을 연결한 새로운 소켓(connected socket)의 파일 디스트립터를 반환하고, 실질적인 데이터 송수신에 이를 이용한다.
서버 소켓(Server Socket)의목적은 클라이언트와 연결된 새로운 소켓을 만드는 것이다.
연결된 새로운 소켓(connected socket)은 연결된 두 기기간의 데이터 송수신을 목적이다.
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
// 성공시 파일 디스크립터 반환, 실패시 -1 반환