[질문] 네트워크 서버프로그램 형태에 관한 질문
글쓴이: zaru / 작성시간: 목, 2003/06/12 - 8:00오후
리눅스에서 C로 네트워크 서버 프로그램을 만들려고 합니다.
서버에서 1234란 포트로 리슨하고 있다가 클라이언트에서 연결요청이 들어오면 포크해서 통신하고, 서버는 다시 리슨하고 또 연결요청이 들어오면 포크해서 통신하고 하는 구조입니다. 여기서 의문이 되는 것은 프로세스 기반으로 하는 포크와 프로세스에서 쓰레드를 쓰는 것중 어떤것이 더 효율적이냐 하는 것입니다.
즉, 클라이언트는 하나의 IP와 포트번호로 16개가 동시에 들어 올 수 있습니다.
그리고, 소켓 연결 후 서버는 클라이언트에게 ENQ를 주면, 그 다음 클라이언트는 요청전문(N bytes)을 보내고, 서버에서는 전문을 수신 후 응답전문을 보내고, 클라이언트는 ACK를 보내고, 서버는 ACK를 받으면 EOT를 클라이언트에 보내고 소켓을 종결합니다. 이 과정이 정상적으로 끝나야 DB에 값을 써 넣습니다.
그런데, 이 16개의 클라이언트가 하나의 DB에 같은 테이블을 억세스 합니다. 이것을 순차적으로 해야 할 것 같은데요. 또 클라이언트에서 일정시간 응답이 없으면 서버에서 강제적으로 소켓을 끊어야 합니다.
이러한 과정을 진행해야 하는 소켓 서버를 어떤 식으로 해야 좋을까요?
블러킹, 넌블러킹, 비동기, I/O 멀티플렉싱 등 여러가지가 있는것 같은데 실제 응용할려고 하니까 어떤 걸 써야 하는지 잘 모르겠습니다.
경험자 분들의 명쾌한 해설을 기대합니다.
감사합니다.
Forums:
[quote]그런데, 이 16개의 클라이언트가 하나의 DB에 같은 테이블
DB 부분은 transaction으로 처리를 하심이 옳습니다. 프로그래에서 스케쥴어쩌구를 고혀하지는 마시고요. DB API레벨에서 DBMS의 트랜잭션으로 처리하심이 옳습니다. 즉, 그 문제는 DBMS에게 넘겨서 처리하세요.
클라이언트에서 일정시간 응답이 없으면 서버에서 강제로 끊어야하는 것은 주기적으로 검사하셔야 합니다. 보통 클라이언트와 서버가 주기적으로 특정 메시지를 주고 받도록 프로토콜을 설계하셔야 겠습니다.
처음 이런 서버작업을 하신다면, 지금사용하시는 방법도 그리 나쁘지 않다고 여겨집니다. 가장 단순명료하니까요. 일단 지금 선택하신 방식으로 개발하시고, 차후에 시간을 내서 이런 방법들을 사용해 보시는게 좋을듯 합니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
댓글 달기