Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
Docbook 원문

listen(2)

1장. listen(2)

차례
1.1. 사용법
1.2. 설명
1.3. 반환값
1.4. 에러
1.5. 예제
1.6. 관련문헌

소켓(:12)의 연결 대기열(:12)을 만든다.


1.1. 사용법

#include <sys/socket.h>

int listen(int s, int backlog);
		


1.2. 설명

서버(:12)측 프로그램은 socket(2)함수를 이용해서 클라이언트(:12)의 연결을 받아들일 듣기소켓을 만들게 된다. 클라이언트의 연결은 듣기소켓(:12)을 통해서 이루어지는데 클라이언트는 connect(2)를 호출해서 서버에 연결을 시도하고, 3번:::악수기법(:12)이 성공하면 서버와 완전한 연결이 만들어 진다.

만들어진 연결은 queue(:12)에 들어가게 되고 서버측에서 accept(2)를 호출하면 비로서 서버는 연결소켓을 만들고 만들어진 연결소켓(:12)을 이용해서 클라이언트와 통신하게 된다.

listen(2) 시스템호출(:12)은 SOCK_STREAM과 SOCK_SEQPACKET에만 사용된다.

a는 socket(2)에 의해서 만들어진 듣기 소켓이다. backlog는 연결이 대기할 수 있는 큐의 갯수이다. 만약 backlog에 연결이 모두 찬 상태에서 새로운 연결을 시도한다면, 클라이언트는 ECONNREFUSED 에러를 받게될 것이다. 만약 재전송을 지원하는 프로토콜을 사용한다면 에러를 무시하고 성공할 때까지 재시도를 하게 된다.


1.3. 반환값

성공하면 0을 리턴하고 실패했을 경우 -1을 리턴하고 errno 를 설정한다.


1.4. 에러

EADDRINUSE

다른 소켓이 동일한 포트(:12)를 사용하고 있다.

EBADF

s가 잘못된 소켓지정자이다.

EOPNOTSUP

소켓이 listen을 지원하지 않는다.

ENOTSOCK

s가 소켓이 아니다.


1.5. 예제

#include <sys/socket.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    int server_sockfd, client_sockfd;
    int client_len, n;
    char buf[80];
    struct sockaddr_in clientaddr, serveraddr;

    client_len = sizeof(clientaddr);

    if ((server_sockfd = socket (AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("socket error : ");
        exit(0);
    }
    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serveraddr.sin_port = htons(atoi(argv[1]));

    bind (server_sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
    listen(server_sockfd, 5);

    while(1)
    {
        memset(buf, 0x00, 80);
        client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr,
                            &client_len);

        if ((n = read(client_sockfd, buf, 80)) <= 0)
        {
            close(client_sockfd);
            continue;
        }
        if (write(client_sockfd, buf, 80) <=0)
        {
            perror("write error : ");
            close(client_sockfd);
        }
        close(client_sockfd);
    }
}
		
위 프로그램은 클라이언트의 메시지를 읽어서 그대로 재 전송하는 echo(:12) 프로그램이다.


1.6. 관련문헌

  1. Socket Layer