0

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

客户端 C 首先通过 TCP 向 DD 发送它感兴趣的号码列表,并在 UDP 上侦听数据。一段时间后(几分钟),客户可能会通过向 DD 发送更多号码来更新其订阅列表。

我可以用两种方式设计它。

第一的:

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 将不必要地等待很长时间。

鉴于我的数据分发器将为许多客户提供服务,其中哪一个似乎是有效的方式?

4

1 回答 1

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

于 2013-10-16T10:19:04.817 回答