listen(2)

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

int listen(int sockfd, int backlog);

SOCK_STREAM, SOCK_SEQPACKET 등의 연결지향형 socket에 대해서 server socket을 활성화하여 client의 접속을 허용하게 합니다. client의 접속 요청에 대해 accept(2)를 통해서 연결이 맺어지고, accept(2)되지 못한 요청은 backlog의 크기만큼 queue에 쌓입니다. backlog의 크기보다 많은 Connection이 쌓이면 Client는 ECONNREFUSED 오류가 발생합니다. 

 

 

파라미터

sockfd
    - socket(2)를 통하여 생성한 socket descriptor입니다.
      이 sockfd를 생성하는 socket(2)함수를 호출할 때에 2번째 파라미터인 type이
      SOCK_STREAM, SOCK_SEQPACKET과 같은 연결지향형이어야 합니다.
backlog
    - client의 접속 요청에 대해서 accept(2)를 통하여 양쪽의 socket이 연결되는 데, 
      accept(2)가 빨리 되지 않을 때에 대기할 queue의 갯수입니다.
    - client의 접속 요청이 많은 경우, 대기되지 않고 빠른 accept를 할 수 있도록 
      Multi-Process / Multi-Thread 등의 서버 프로그래밍 방법을 사용합니다.

 

RETURN

-1이 아님
    - 정상적으로 server socket이 활성화되었습니다.

-1
    - 오류가 발생하였으며, 상세한 오류는 errno에 저장됩니다.


 EADDRINUSE : 이미 사용하고 있는 주소입니다.
 EBADF      : sockfd가 유효하지 않습니다.
 ENOTSOCK   : sockfd가 socket이 아닙니다.
 EOPNOTSUPP : SOCK_STREAM, SOCK_SEQPACKET이 아닌 다른 type으로 설정된 socket입니다.
              연결 지향형 socket이 아닙니다.

 


활용 예제

 

Sample. TCP/IP 서버 Socket sample

#include <string.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>

#define SERVER_PORT    6905

    ......
    
    int    server_fd;
    struct sockaddr_in server;

    ......

    if((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        fprintf(stderr, "socket create error: %s\n", strerror(errno));
        return -1;
    }

    memset(&server, 0x00, sizeof(struct sockaddr_in));

    server.sin_family      = AF_INET;
    server.sin_port        = htons(SERVER_PORT);
    server.sin_addr.s_addr = INADDR_ANY;

    if(bind(server_fd, (const struct sockaddr *)&server, sizeof(struct sockaddr_in)) == -1) {
        fprintf(stderr, "socket create error: %s\n", strerror(errno));
        return -1;
    }

    if(listen(server_fd, 20) == -1) {
        fprintf(stderr, "socket create error: %s\n", strerror(errno));
        return -1;
    }

    ......

 


see also : Socket 통신과 Socket 응용

 

 

 

 

 

블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요