2013-05-26 5 views
0

QT에서 HTTP 요청을 처리 할 간단한 웹 서버를 작성하려고합니다. QT에는 QThread가 있으며 동시 연결을 처리하는 데 사용할 수 있습니다. 내가 원하는 것은 적어도 2 명의 작업자 프로세스가 있어야 마스터의 요청로드 대부분을 작업자에게 전달할 수 있다는 것입니다. 문제는 마스터가 포트 80에서 수신 대기하고 들어오는 연결이있을 때 "수락"합니다. 들어오는 연결을 수락하는 코드를 어떻게 작성해야합니까? 마스터가 포트 80작업자 프로세스가 동일한 포트에서 수신 대기하는 방법

내가 Nginx에 lighttpd를가 작업자 프로세스를 알고에 결합하고 포트에서 수신에만 마스터로 작업자 프로세스는 80 나 방법을 알려 주시기 바랍니다 동일한 포트에서 수신 할 수 이 작업을 수행해야합니까? 아니면 NGINX 또는 Lighttpd가이를 구현해야합니까?

답변

1

당신은 두 가지 선택이 있습니다

  • 마스터 프로세스가 소켓에 연결을 수락하지 않습니다하지만 노동자는 않습니다. 연결이 들어 오면 무작위로 근로자 중 한 명이 작성한 accept()이됩니다. accept()에 차단 된 근로자 중 어느 근로자가 받겠는지 통제 할 수는 없습니다.
  • 마스터 프로세스 만 연결을 허용합니다. 그런 다음 마스터 프로세스는 SCM_RIGHTS을 사용하여 sendmsg()을 사용하여 다른 소켓을 통해 작업자에게 허용 된 연결을 전달합니다. 이 작업을 수행하기 위해 마스터와 각 작업자 사이에 하나씩 socketpair() 개의 묶음을 가질 수 있습니다. 당신이 작업자 스레드가 아닌 작업자 프로세스를 사용하는 경우

, 당신은 (파일 기술자가 이미 작업자 스레드에서 유효하기 때문에 노동자로 받아 들인 접속을 보낼 소켓 트릭에 SCM_RIGHTS를 사용할 필요가 없습니다 단일 프로세스의 개별 스레드에 대해 별도의 파일 설명자 네임 스페이스가 없음). 이 경우 작업자가 새 연결을 선택해야한다는 것을 알 수 있도록 세마포 및 큐와 같은 간단한 신호를 사용할 수 있습니다.

+0

그러나 마스터가 동일한 포트에서 수신 대기하는 경우 작업자 프로세스는 동일한 포트에서 어떻게 수신 대기합니까? 또한 작업자 프로세스가 연결을 수락하지 않으면 어떻게 처리 할 수 ​​있습니까? 첫 번째와 두 번째 방법으로 나에게 줄 수있는 모범이 있습니까? 나는 가장 좋은 것을 선택하겠습니다. – user1066991

0

내가하는 방법은 Threaded Fortune Cookie example과 비슷하지만 QThread 자체에서 파생 된 FortuneThread 클래스는 없을 것입니다. 차라리 QRunnable에서 파생시킨 다음 QThreadPool에 전달합니다.

이 방법을 사용하면 시스템에서 실행중인 활성 스레드 수에 제한을 둘 수 있으며 스레드 생성 및 삭제를 계속할 필요가 없습니다. 잠시 동안 스레드 풀이 유휴 상태가 될 때까지 스레드를 계속 재사용하면됩니다 .

관련 문제