多个 TCP 连接与单个连接
Multiple TCP connections vs single connection
我正在设计一个数据分发器(比如生成随机数),它将为多个客户端提供服务。
客户端 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将不必要地等待很长时间。
鉴于我的数据分发服务器将为许多客户提供服务,其中哪一个似乎是有效的方法?
支持事件驱动循环的 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/包装器感兴趣
- 当套接字连接断开时检测C/C++Unix
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 无法在windows上使用mingw将sqlite3与c连接
- 到连接组件算法的问题(递归)
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- 无法在C++中建立与MySQL数据库的连接
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 使用单个套接字处理多个传入的 UDP 连接
- 连接 OpenCV 垫和单个值
- 将单个队列连接到多个qmgrs C++
- 多个 TCP 连接与单个连接
- 将所有对象信号连接到单个插槽
- 具有多个逻辑数据流的单个套接字连接(区分数据包)
- 可以将多个信号连接到单个插槽
- 我应该为多个连接使用单个ODBC环境吗
- 使用Boost.Asio在单个端口上接受IPv4和IPv6连接
- Qt:将多个输入部件与valueChanged(int)信号连接到单个插槽
- 在单个字符串中显示Unicode QString的QLatin1String连接
- 单个线程中的多个 tcp 连接,使用 libevent 或 boost::asio。有可能?