【发布时间】:2015-03-18 23:00:37
【问题描述】:
我正在设计一些基于 TCP 和 UDP 的协议,我需要同时接收来自多个客户端的数据:每个客户端将通过 2 个套接字(TCP 和 UDP)发送这些数据。我怀疑如何实现服务器。我正在经历几个选择:
- 使用 select()(1 个选择)在一个线程中实现从所有套接字的所有读取。
- 在一个线程中处理所有 UDP 套接字,在另一个线程中处理 TCP(2 个选择)。
- 要在单独的线程中运行每个接收,套接字处于阻塞模式。
我的目标是在 UDP 套接字上实现最大吞吐量(最小丢失数据报)和在 TCP 套接字上实现最短处理时间。我认为在多核 CPU 上,选项 #3 可能会提高效率。我说的对吗?
【问题讨论】:
-
您正在设计一个实现,而不是一个协议。我建议你先用简单的方法做,然后看看你是否真的有问题要解决。
-
select为您提供合理的超时时间,并且还可以等待未决信号(请参阅signalfd)。在select唤醒后,您始终可以将处理移至其他线程。此外,使用任何方法停止正在运行的线程始终是一个好习惯。阻止read不会给你这个。 -
@EJP,实际上我正在设计 TCP 和 UDP 之上的新协议。但我的问题是关于实现
-
@ zoska 1. 我想做一个在 Linux 和 Windows 中工作的非常简单的实现。 2. 抱歉,没看懂:为什么阻塞读取和停止线程不同?
-
影响此类决策的因素太多,无法给出一个简单的千篇一律的答案。我的建议:做更多的研究(有大量免费的在线文章以及关于网络编程的整本书),构建一些“玩具”应用程序,看看什么效果很好,什么适合你的技能/舒适区,然后回到 SO .com 当您有更具体的问题/问题时。
标签: c multithreading sockets tcp udp