多个TCP连接与单个连接

时间:2013-10-16 10:04:04

标签: c++ tcp

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

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

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

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

鉴于我的数据分销商将为许多客户服务,其中哪些似乎是有效的方式?

1 个答案:

答案 0 :(得分: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/包装器感兴趣