2013-05-26 75 views
0

我想在QT中編寫一個簡單的Web服務器來處理HTTP請求。 我知道QT有QThreads,我可以用它來處理同時連接。 我想要的是擁有至少2個工作進程,以便將大部分請求的負載從主服務器傳遞給工作人員。 問題是主端口正在監聽端口80,並且在有傳入連接時它會執行「接受」。 我應該如何編寫工作人員的代碼以接受傳入連接? 工作進程不能在同一端口上偵聽作爲主綁定到端口80工作進程應該如何監聽同一個端口

我知道nginx的和lighttpd的有工作進程,這是唯一的端口上偵聽主80 請讓我知道如何我應該這樣做,或者NGINX或Lighttpd如何實現這一點。

回答

1

你有兩個選擇:

  • 主進程不接受套接字上的連接,但工人做。當一個連接進入時,其中一個工作人員隨機編輯它accept()。您無法控制accept()上被阻止的哪些工人將收到它。
  • 只有主進程接受連接。然後,主進程使用sendmsg()SCM_RIGHTS通過另一個套接字將接受的連接分派給工作人員。你可以有一大堆socketpair(),一個在主人和每個工人之間,來完成這個任務。

如果您使用的工作線程,而不是工作進程,那麼你就必須使用SCM_RIGHTS的插座上招到接受的連接發送到工人,因爲文件描述符已經在工作線程有效(沒有單獨的文件描述符名稱空間用於單個進程的單獨線程)。在這種情況下,您可以使用簡單的信號如信號量和隊列來讓工作人員知道它應該獲取新的連接。

+0

但是,如果主服務器在同一端口上偵聽,工作進程將如何偵聽同一端口?如果一個工作進程沒有監聽,那麼工作進程如何接受()一個連接?有沒有什麼例子可以給我第一種和第二種方法先生?我會選擇哪一個是最好的。 – user1066991

0

我會這樣做的方式將類似於Threaded Fortune Cookie example除了我不會有從QThread本身派生FortuneThread類。我寧願讓它們派生自QRunnable,然後將它們傳遞給QThreadPool

這樣,您可以對系統中運行的活動線程的數量進行限制,並且不必一直不停地創建和銷燬線程,只需重用它們,直到線程池閒置一段時間。