2013-10-16 212 views
0

我正在設計一個數據分配器(例如生成隨機數),它將爲多個客戶端提供服務。多個TCP連接vs單個連接

客戶端C首先將它感興趣的數字列表發送給DD上的TCP並監聽UDP上的數據。經過一段時間(幾分鐘)後,客戶可以通過向DD發送更多號碼來續訂其訂閱列表。

我可以用2種方法來設計它。

FIRST:

New_Client_Connected_Thread(int sock_fd) 
{ 
    --Get Subscription 
    --Add to UDP Publisher List 
    --close(sock_fd) 
} 

每次客戶想要訂閱新的數據集,將建立一個新的TCP連接。

第二:

這將需要
New_Client_Connected_Thread(int sock_fd) 
    { 
     while(true) 
     { 
      --wait for new subscription list 
      --Get subscription 
      --Add to UDP Publisher List. 

     } 
    } 

每個客戶端只有1個TCP連接。

但是,如果客戶端不發送新的請求,Client_Thread會長時間不必要地等待。

鑑於我的數據分銷商將服務於很多客戶,他們中的哪一個似乎是有效的方式?

回答

2

支持事件驅動循環的Libevent或libev可能更適合於此的TCP部分。

您可以避免使用線程,併爲TCP部分添加一個單一循環來將客戶端添加到發佈者列表中。 Libevent在管理大量和大量連接和每秒插槽拆卸方面非常高效,並被Tor(洋蔥路由器)等東西使用。

看起來應用程序中的TCP連接更像是「控制平面」連接,因此它很可能取決於客戶需要多長時間「控制」你的服務器,以便決定是否在控制之後打開或關閉套接字。請記住,保持成千上萬的TCP連接永久打開它在主機上的內核資源,但在其他打開和關閉連接時,由於連接建立時間的緣故,整個時間會引起一些延遲。

有關libevent TCP服務器的示例,請參閱https://github.com/libevent/libevent/blob/master/sample/hello-world.c

由於您使用的是C++編碼,因此您可能會對libevent的http://llucax.com.ar/proj/eventxx/包裝感興趣