728x90

멀티 프로세스 기반 다중 접속 서버 모델

- 1단계 : 클라이언트에서 연결 요청이 들어오면 서버의 부모 프로세스에서 accept 함수를 통해 연결요청 수락

- 2단계 : 자식 프로세스를 생성해서 accept 시 생성된 소켓을 넘겨줌(fork 시 복사되므로 전달이 포함)

- 3단계 : 자식 프로세스는 전달 받은 소켓을 통해 서비스 제공

- fork를 하면 부모 프로세스를 전부 복사하기 때문에 부모 프로세스와 자식 프로세스 모두 서버 / 클라이언트 소켓을 갖게 됨

- 부모 프로세스는 클라이언트 소켓이 불필요하고 자식 프로세스는 서버 소켓이 불필요 하므로 close

int main(int argc, char *argv[])
{
    int serv_sock, clnt_sock;
    struct sockaddr_in serv_adr, clnt_adr;
    socklen_t adr_sz;
    
    ...;
    if(bind(serv_sock, (struct sockaddr*) &serv_adr, sizeof(serv_adr))==-1) {
        printf("bind() error");
    }
    if(listen(serv_sock, 5)==-1) {
        printf("listen() error");
    }
    
    while(1)
    {
        adr_sz=sizeof(clnt_adr);
        clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_adr, &adr_sz);
        if(clnt_sock==-1) {
            continue;
        }
        else {
            puts("new client connected...");
        }
        
        pid=fork();
        if(pid==-1)
        {
            close(clnt_sock);
            continue;
        } // fork 오류
        if(pid==0)
        {
            close(serv_sock);   // 자식 프로세스일 경우 서버 소켓 close
            while((str_len=read(clnt_sock, buf, BUF_SIZE))!=0) {
                write(clnt_sock, buf, str_len);
            }
            close(clnt_sock);
            puts("client disconnected...");
            return 0;
        } // 자식 프로세스 일 경우 에코 서비스 제공
        else {
            close(clnt_sock);
        } // 부모 프로세스일 경우 클라이언트 소켓 close
    }
    close(serv_sock);
    return 0;
}

 

728x90

+ Recent posts