TCP/IP는 socket관련 API를 통하여 socket을 생성합니다.

 

TCP/IP socket 통신 함수 호출 순서

 

TCP/IP의 Server와 Client의 기본적인 socket 생성과 접속 및 데이터 송수신의 흐름은 아래와 같습니다.

 

Server TCP/IP Flow

 

서버 Socket의 생성 및 처리 절차는 다음과 같습니다.

 

1. socket(2)함수를 통하여 socket을 생성합니다.

   TCP/IP는 IP 기반이므로 Address Family를 AF_INET 설정하고 TCP는 연결지향형으므로 SOCK_STREAM으로 설정합니다.

    int server_fd;

    if((sever_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        fprintf(stderr, "SERVER SOCKET 생성 오류: %s\n", strerror(errno));
        return -1;
    }

 

2. 생성된 socket에 bind(2)함수를 통하여 서버 port번호를 설정합니다.

    struct sockaddr_in server;

    /* PORT번호를 재활용으로 설정합니다. */
    setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
    server.sin_family      = AF_INET;
    server.sin_port        = htons(port);
    server.sin_addr.s_addr = INADDR_ANY;

    if(bind(server_fd, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) == -1) {
        fprintf(stderr, "SERVER SOCKET 생성 오류: %s\n", strerror(errno));
        return -1;
    }

 

3. listen(2)함수는 서버 port번호가 설정된 socket을 통신이 가능하도록 서버 socket이 동작하게 됩니다. 또한 접속한 client가 accept를 하지 못한 경우에 queue크기만큼 쌓아두게 되며, queue 크기보다 많은 접속은 오류 처리됩니다.  

    if(listen(server_fd, 50) == -1) {
        return -1;
    }

 

4. accept(2)는 client의 connect(2)에 대해 접속을 허락하고 client와 통신할 수 있는 새로운 socket을 생성합니다.

 accept(2)를 통해서 생성된 socket descriptor로 각 각의 client와 실질적인 통신을 할 수 있습니다.

    int connected_fd;
    socklen_t addr_len = 0;
    struct sockaddr_in client

    addr_len = sizeof(struct sockaddr_in);

    if((connected_fd = accept(server_fd, (struct sockaddr *)&client, &addr_len)) == -1) {
        return -1;   
    }

 

5. recv(2)/send(2)는 connected_fd를 통하여 이루어집니다.

동시에 접속한 여러개의 client의 요청에 대해 Server는 Multi-Process나 Multi-thread 등의 구조로 client의 요청을 수용할 수 있는 구조로 설계를 하고 구현해야 합니다.

 

accept 이후에는 multi-process, multi-thread, multiplexing 등의 기법으로 요청한 client와 1:1로 데이터 전문을 처리하는 부분입니다.

client요청과 서버의 응답에 대해 전문의 header, body 등을 정의하고 전송할 데이터의 크기 등을 어떻게 설정할 것인 지 등 상세한 전문 설계가 필요합니다.

 

전문의 설계에 따라 client의 send(2)에 대해서 server는 recv(2)로 대기하고 결과를 전송하면, client는 recv(2)하는 등의 데이터를 주고 받는 흐름대로 송수신합니다.

 

6. close(2)

데이터 송수신이 마무리되면 더 이상 접속을 유지할 필요가 없는 경우에, connected_fd를 close합니다.

 

 


see also :  TCP/IP 통신 프로그램   Socket 통신 관련 Library  

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

Tag , , ,

댓글을 달아 주세요