2013-10-16 167 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/包装感兴趣