【发布时间】:2016-05-23 09:48:29
【问题描述】:
我正在通过一个 TCP 套接字接收大量数据,我希望将这些数据发送到多个额外的套接字(基本上与第一个套接字的内容相呼应)。我的要求如下:
- 通过读取套接字接收到的任何数据都必须可靠地(按到达顺序)发送到写入套接字
- 在任何情况下,写入都必须不阻止从主套接字读取
- 断开/断开的管道不应中断对入站套接字的读取
目前我正在使用一个多线程系统,该系统维护从入站套接字读取的数据的链接列表,并为每个出站套接字设置线程。当消息通过入站套接字到达时,我向出站套接字线程发出信号,以从主线程创建链表的副本并在不中断操作的情况下广播数据。我的链表结构在主线程上维护fd_set 文件描述符,它用于确定消息何时被每个出站套接字成功复制和广播(从而将其从列表中删除)。
这显然是很多活动部件,我想看看我是否遗漏了一些可以在这种情况下使用的基本内容。
【问题讨论】:
-
您可以使用环形缓冲区而不是链表,并使用 select 多路复用而不是多线程,但这些是我看到的唯一明显的东西。
-
为什么要作者复制链表?
-
@EOF 因为主线程不断地改变/剔除链表。我获取一个互斥锁,复制列表,然后在释放锁后广播复制的列表,以避免阻塞主线程上的读取。
-
'基本'好吧,流量控制怎么样?如果数据的读取速度快于其中一个传出套接字的消耗速度,您会怎么做?如果你继续缓冲,你的内存需求就会失控。
-
你真的应该用队列替换这个列表。
标签: c multithreading sockets networking pthreads