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
'Programming > Network' 카테고리의 다른 글
열혈 TCP/IP 11-1. 프로세스간 통신의 기본 개념 (0) | 2021.03.01 |
---|---|
열혈 TCP/IP 10-5. TCP의 입출력 루틴(Routine) 분할 (0) | 2021.03.01 |
열혈 TCP/IP 10-3. 시그널 핸들링 (0) | 2021.03.01 |
열혈 TCP/IP 10-2. 프로세스 & 좀비(Zombie) 프로세스 (0) | 2021.03.01 |
열혈 TCP/IP 10-1. 프로세스의 이해와 활용 (0) | 2021.03.01 |