我正在设计一个数据分发服务器(例如,生成随机数),它将为多个客户端提供服务。

客户端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/包装器感兴趣

07-24 09:45
查看更多