2009-12-24 3 views
0

꽤 기본적인 클라이언트 - 서버 프로그램을 개발하고 싶습니다.클라이언트 - 서버 디자인

하나의 소프트웨어가 xml (또는 모든 데이터)을 읽고이를 서버로 보내면 서버가이를 조금 조작하여 결국 디스크에 기록합니다.

문제는 내가 (클라이언트 측에서) 디스크에 많은 xml 파일이 있다면, 서버에 대한 다중 연결을 열고 싶지 않고 하나씩 차례로 열어보고 싶다는 것입니다.

내 첫 번째 질문은 : 내가 그 중 하나가 디스크에서 읽을 준비가되었을 때 알 수 있도록 모든 파일 핸들과 waitformultipleobjects를 유지하는 스레드가 있다고 가정 해 봅니다. 그리고 모든 파일에 대해 해당 specifi 파일을 서버에 보내는 것으로 가정하는 적절한 소켓이 있습니다. 소켓에 대해 어떤 소켓을 보낼 준비가되었는지 알기 위해 select 함수를 사용할 수 있습니다. 하지만 파일과 appropraite 소켓 모두 보낼 준비가되었음을 알 수있는 방법이 있습니까?

두 번째로 클라이언트를 설계하는 데 더 효율적인 방법이 있습니다. 현재 설계에서 다중 프로세서 컴퓨터에서 충분히 효율적이지 않은 스레드를 사용하고 있습니다. (비록 모든 소켓 연결에 대해 새 스레드를 더 잘 확인해도 좋을 지 모르겠지만)

세 번째로 서버의 경우 원자로 패턴에 대해 읽습니다. 그것은 적절하지만 여전히 제 두 번째 질문처럼, 한 스레드를 사용하는 동안 충분히 effent되지 않는 것 같습니다.

아마도 완성 포트와 함께 사용할 수 있습니까? 그들은 매우 효율적이라고 생각하지만 실제로 사용하지는 않으므로 정확히 어떻게 모릅니다.

모든 답변과 일반적인 제안은 좋을 것입니다.

+0

자본의 다소 단순한 예술을 배우시겠습니까 모든 문장의 시작 부분에 하나? 그것은 당신의 질문을 훨씬 더 가독하게 만들 것입니다. –

답변

2

boost::asio을보세요. OS 대기 동작 (waitforsingle/multiple, select, epoll 등)을 기본적으로 사용하는 프록터 패턴 (docs 참조)을 사용하여 다음과 같은 단일 스레드를 매우 효율적으로 사용합니다. 당신이 구현을 바라 보는 것처럼 시스템.

asio는 소켓뿐만 아니라 파일을 읽고 쓸 수 있습니다. asio를 사용하여 파일에 대한 비동기 읽기를 수행 할 수 있습니다. 완료되면 콜백을 호출하고 읽기 버퍼를 비동기 쓰기 소켓으로 제출합니다. Asio는 소켓이 각 보류중인 쓰기 작업을 완료 할 때 모든 비동기 쓰기 버퍼를 전달하는 것을 처리합니다.

이러한 각 작업은 비동기 적으로 수행되므로 스레드는 읽기 또는 쓰기를 시작하기 위해 실제로 사용 중이므로 나머지 시간 동안 유휴 상태로 있습니다.