2009-12-21 67 views
1

我讀有關辦法implemnt客戶端 - 服務器的最有效的方式,和我撞了那個鏈接: http://msdn.microsoft.com/en-us/library/ms740550(VS.85).aspxTCP/IP和設計網絡應用

說:

「併發連接應不超過兩個,超出兩個併發連接導致資源浪費一個很好的規則是有多達四個短暫連接或每個目的地兩個持久連接「

我不能完全得到什麼他們的意思是2 ...他們是什麼意思的persiste NT?

比方說,我有一個服務器,誰聽衆多的客戶端,他們想與服務器做一些工作,我怎麼能保持只有2個連接打開? 無論如何,實現它的最好方法是什麼?我讀了一些關於完成端口的內容,但找不到代碼的好例子,或者至少有一個不錯的解釋。

感謝

回答

5

你讀的最後一句話:

一個很好的規則是有多達四個 短暫的連接,或每 目的地2個 持久連接。

很難說從文章中,但通過目的地我認爲他們的意思是客戶端。這不是一篇很好的文章。

+0

這就是我如何閱讀文章,以及(這是沒有這麼多的物件,沒有很多的解釋做了一些簡單的語句)。一般來說,除非服務器本身正在關閉,否則服務器不會規定與客戶端的連接的生命週期。客戶決定終身。然而,服務器可以指示每個客戶端只獲得一個連接。 –

2

持久連接是客戶端連接到服務器,然後執行其所有操作而不會丟失連接的地方。即使客戶端有一段時間不需要服務器,它仍然保持與服務器的連接,以備可能再次需要時使用。

短暫連接將是客戶端連接,執行其操作然後斷開連接的連接。如果服務器需要更多幫助,它將重新連接到服務器並執行另一個單一操作。

作爲實現連接偵聽端的服務器,您可以在偵聽的TCP/IP套接字中設置選項,以限制將在套接字級保持的連接數並確定您希望連接的連接數接受 - 這將允許您根據需要接受2個持續連接或4個短暫連接。

0

他們的意思是「持久性」,是一個打開的連接,然後保持打開狀態。確定將資源與「永遠在線」連接捆綁在一起還是比較昂貴,或者在每次需要時都要承擔打開和關閉連接的開銷,這是很常見的問題。

雖然這可能值得退一步。

如果您的服務器必須偵聽來自大量客戶端的請求,那麼您可能對基於消息的體系結構具有完美的用例。如果你使用像TCP/IP那樣的緊密連接的連接,你的客戶端和服務器將必須知道很多關於彼此的信息,你將不得不編寫大量的低級連接代碼。

在基於消息的體系結構下,客戶可以將消息放置在隊列中。服務器然後可以監視該隊列。它可以將消息從隊列中取出,執行工作,並將響應放回隊列中,客戶端可以從中選擇它們。

有了這樣的設計,客戶端和服務器就不必知道任何關於彼此的事情。只要他們可以在隊列中放置正確形成的消息,並連接到隊列,就可以用完全不同的語言來實現,並且可以在不同的操作系統上運行。

面向消息傳遞的中間件如Apache ActiveMQ和Weblogic提供了API,您可以使用C++來管理和使用隊列以及其他消息對象。 ActiveMQ是開源的,Weblogic是由甲骨文(誰買了BEA)出售的。還有很多其他優秀的消息服務器,因此,如果消息聽起來像是值得探索的,那麼以這些消息服務器爲例,以幫助您入門。

+0

......當然,如果您的用例比我所設想的要低,那麼使用面向消息傳送的中間件的開銷可能會太高。這一切都取決於客戶端和服務器正在進行的工作類型。 –

+0

由於鏈接來自MSDN,並且您已使用C++對此進行了標記,因此您可能擁有使用MSMQ所需的一切。我沒有使用它,但它似乎是在正確的鄰里。 我在評論中遇到了錨標籤的問題。這裏是MS官方網頁: http://www.microsoft.com/windowsserver2003/technologies/msmq/default.mspx –

0

我認爲關鍵詞是「每個目的地」。單個TCP連接嘗試加速到可用帶寬。所以如果你允許更多的連接到相同的目的地,他們必須共享相同的帶寬。

這意味着每個傳輸將比它可能會慢,並且服務器必須分配更多的資源更長的時間 - 每個連接的數據結構。

因爲建立tcp連接是「耗時」的,所以在服務第一個連接時允許建立第二個連接是有意義的,因此它們是相互重疊的。對於短連接,建立時間可能與爲連接本身提供服務相同(請參閱性能較差的示例),因此需要更多連接來有效填充所有帶寬。

(抱歉,我無法發佈超鏈接) 這裏msdn.microsoft.com/en-us/library/ms738559%28VS.85%29.aspx你可以看到,什麼是糟糕的表現。

這裏msdn.microsoft.com/en-us/magazine/cc300760.aspx是線程服務器的一些例子,它的表現相當不錯。

您可以通過限制呼叫號碼accept()來限制打開連接的數量。你可以通過取消連接來限制來自同一個源的連接數,當你發現,你已經有多於兩個來自這個位置的連接(只計算它們)。

例如SMTP以類似的方式工作。當連接太多時,它會返回代碼並關閉連接。

也看到了這個問題: What is the best epoll/kqueue/select equvalient on Windows?