[완료]c non-block 소켓으로 서버를 만들려 합니다.. 타임아웃 부분의 구현을 어떤식으로 해야 할지 조언 부탁드려요,
읽어주신 분들 우선 감사드립니다
제목 처럼 c언어 non-block 소켓으로 서버를 만들려 합니다.
처음엔 프로세스 풀을 생성 후에 각 프로세스에서 쓰레드 풀을 생성하여
부모 프로세스 - 자식 프로세스1 - 쓰레드1
- 쓰레드2
- ....
- 쓰레드n
- 자식 프로세스2 - 쓰레드1
- 쓰레드2
- ....
- 쓰레드n
- 자식 프로세스n - 쓰레드1
- 쓰레드2
- ....
- 쓰레드n
이런식으로 생성을 하여 쓰레드 마다 클라이언트 한명씩 통신을 하게 하려 했습니다.
쓰레드마다 epoll 이나 select 등을 사용하여 타임설정 후 write 후에 select/epoll 에서 지정한 시간만큼 동안 이벤트가 발생하지 않으면 타임아웃으로 처리하려했으나,,
위와 같은 방법에 context switching 과정에서 많은 부하가 따를것 같아서..
부모 프로세스에서 여러 쓰레드를 생성후에 쓰레드마다 n개의 클라이언트가 연결되도록 하려 합니다..
쓰레드마다 역시 epoll이나 select를 사용하구요..
예를들어서,,
1번 쓰레드에 50명이 연결되어 있는데,,, 첫번째 사용자에게 데이터를 보낸 후 몇초 동안 응답이 없으면 데이터를 재전송 해주려고 합니다.
최초 방법에선 쓰레드당 1명이 연결되므로 타임아웃 관리하기가 편했는데,, 쓰레드당 여려명이 연결되면 이벤트가 수시로 발생할 것 같은데,, 어떤 식으로 타임아웃을 구현해야 할지
조언 부탁드립니다.
일단 한 스레드가 여려개의 소켓을 감시해야 하고 각
일단 한 스레드가 여려개의 소켓을 감시해야 하고 각 소켓마다 타임아웃 관리할려면
(소켓,마지막 응답시각) 을 둬야 합니다.
이제 이 값을 기반으로 주기적으로 감시(1)하거나 가장 최소 시각으로 감시(2)하거 하겠지요.
(1)번의 경우 1초 단위로 select난 epoll을 걸고 매번 저 목록을 갱신합니다.
(2)번의 경우 (소켓, 응답시각) 목록에서 타임아웃이 발생할 최소 시각을 구해서 그 값만큼만
select/epoll 의 timeout 시각으로 사용하면 됩니다. 이 경우 저 목록을 타임아웃 시각으로
소팅해서 관리하거나 또는 현재 접속된(관리하고 있는) 클라이언트 만큼 루프를 돌면 되구요.
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
댓글 달기