【问题标题】:Reliably broadcasting the same data to multiple sockets in C可靠地将相同的数据广播到 C 中的多个套接字
【发布时间】:2016-05-23 09:48:29
【问题描述】:

我正在通过一个 TCP 套接字接收大量数据,我希望将这些数据发送到多个额外的套接字(基本上与第一个套接字的内容相呼应)。我的要求如下:

  • 通过读取套接字接收到的任何数据都必须可靠地(按到达顺序)发送到写入套接字
  • 在任何情况下,写入都必须阻止从主套接字读取
  • 断开/断开的管道不应中断对入站套接字的读取

目前我正在使用一个多线程系统,该系统维护从入站套接字读取的数据的链接列表,并为每个出站套接字设置线程。当消息通过入站套接字到达时,我向出站套接字线程发出信号,以从主线程创建链表的副本并在不中断操作的情况下广播数据。我的链表结构在主线程上维护fd_set 文件描述符,它用于确定消息何时被每个出站套接字成功复制和广播(从而将其从列表中删除)。

这显然是很多活动部件,我想看看我是否遗漏了一些可以在这种情况下使用的基本内容。

【问题讨论】:

  • 您可以使用环形缓冲区而不是链表,并使用 select 多路复用而不是多线程,但这些是我看到的唯一明显的东西。
  • 为什么要作者复制链表?
  • @EOF 因为主线程不断地改变/剔除链表。我获取一个互斥锁,复制列表,然后在释放锁后广播复制的列表,以避免阻塞主线程上的读取。
  • '基本'好吧,流量控制怎​​么样?如果数据的读取速度快于其中一个传出套接字的消耗速度,您会怎么做?如果你继续缓冲,你的内存需求就会失控。
  • 你真的应该用队列替换这个列表。

标签: c multithreading sockets networking pthreads


【解决方案1】:

你想做的和我过去二十年来一直在做的一样。

不要锁定和复制整个列表。相反,让每个发送线程只读锁定它当前发送的元素。让接收线程写锁定每个新元素并执行元素删除。允许长列表以适应瞬态爆发。

您可以通过将列表内存映射到文件来使列表持久化。

祝你好运。这项任务很重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 2015-10-01
    • 2011-10-30
    • 1970-01-01
    相关资源
    最近更新 更多