我正在设计一个数据分发服务器(例如,生成随机数),它将为多个客户端提供服务。
客户端C首先通过TCP发送对其感兴趣的数字列表,然后侦听UDP上的数据。一段时间(几分钟)后,客户端可以通过向DD发送更多号码来更新其订阅列表。
我可以用2种方法来设计。
第一:
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将不必要地等待很长时间。
假设我的Data Distributor将为许多客户提供服务,那么哪种客户有效呢?
最佳答案
支持事件驱动循环的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/包装器感兴趣