【问题标题】:Read from several sockets: single thread with select vs. multi-thread read从多个套接字读取:带选择的单线程与多线程读取
【发布时间】:2015-03-18 23:00:37
【问题描述】:

我正在设计一些基于 TCP 和 UDP 的协议,我需要同时接收来自多个客户端的数据:每个客户端将通过 2 个套接字(TCP 和 UDP)发送这些数据。我怀疑如何实现服务器。我正在经历几个选择:

  1. 使用 select()(1 个选择)在一个线程中实现从所有套接字的所有读取。
  2. 在一个线程中处理所有 UDP 套接字,在另一个线程中处理 TCP(2 个选择)。
  3. 要在单独的线程中运行每个接收,套接字处于阻塞模式。

我的目标是在 UDP 套接字上实现最大吞吐量(最小丢失数据报)和在 TCP 套接字上实现最短处理时间。我认为在多核 CPU 上,选项 #3 可能会提高效率。我说的对吗?

【问题讨论】:

  • 您正在设计一个实现,而不是一个协议。我建议你先用简单的方法做,然后看看你是否真的有问题要解决。
  • select 为您提供合理的超时时间,并且还可以等待未决信号(请参阅signalfd)。在select 唤醒后,您始终可以将处理移至其他线程。此外,使用任何方法停止正在运行的线程始终是一个好习惯。阻止 read 不会给你这个。
  • @EJP,实际上我正在设计 TCP 和 UDP 之上的新协议。但我的问题是关于实现
  • @ zoska 1. 我想做一个在 Linux 和 Windows 中工作的非常简单的实现。 2. 抱歉,没看懂:为什么阻塞读取和停止线程不同?
  • 影响此类决策的因素太多,无法给出一个简单的千篇一律的答案。我的建议:做更多的研究(有大量免费的在线文章以及关于网络编程的整本书),构建一些“玩具”应用程序,看看什么效果很好,什么适合你的技能/舒适区,然后回到 SO .com 当您有更具体的问题/问题时。

标签: c multithreading sockets tcp udp


【解决方案1】:

每个 TCP 连接有一个线程和一个 UDP 线程。

【讨论】:

    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2014-07-20
    • 2013-04-24
    • 2012-11-05
    相关资源
    最近更新 更多