C 是否向多个线程/套接字发送相同的信息?

C 是否向多个线程/套接字发送相同的信息?,c,linux,multithreading,sockets,pipe,C,Linux,Multithreading,Sockets,Pipe,我正在编写一个服务器应用程序,它只需将一个本地串行端口连接到多个网络连接的客户端。我使用linux和C作为服务器应用程序,因为该程序的设备是一个内存有限的路由器 我已经为多个客户端设置了一切,以便使用fork()进程为每个连接连接并将数据发送到串行端口 我的问题在于将串行端口上传入的数据输出到多个(不同数量的)客户端连接。我的问题在于为每个活动套接字设计一种方法来获取所有传入数据,并且只获取一次。有什么帮助吗?假设您保留了一个列表或其他连接客户端的引用,为什么不针对每一位信息循环一次,然后发送给

我正在编写一个服务器应用程序,它只需将一个本地串行端口连接到多个网络连接的客户端。我使用linux和C作为服务器应用程序,因为该程序的设备是一个内存有限的路由器

我已经为多个客户端设置了一切,以便使用fork()进程为每个连接连接并将数据发送到串行端口


我的问题在于将串行端口上传入的数据输出到多个(不同数量的)客户端连接。我的问题在于为每个活动套接字设计一种方法来获取所有传入数据,并且只获取一次。有什么帮助吗?

假设您保留了一个列表或其他连接客户端的引用,为什么不针对每一位信息循环一次,然后发送给所有客户端?

听起来您需要为每个连接的客户端设置一个数据队列(缓冲区)。每次数据进入端口时,您都会将其发布到每个客户端队列的后面。然后,客户机从各自队列的前端读取数据。由于所有客户机可能以不同的速率/时间读取数据,这将确保所有客户机只获得一次数据副本,并且当更多数据进入时,您不会在等待任何一个客户机时挂断电话。当然,您需要为每个连接的客户机队列分配一定数量的内存(我不确定您期望的客户机数量,您说过您的可用内存有限),如果客户机读取了所有的队列,则需要考虑如何处理。

< P>每个套接字设计的线程可能不是解决这一问题的最佳方法。事件驱动的异步方法应该更适合。但是,如果必须使用线程,并且考虑到串行端口的速度很慢,那么在侦听串行端口的线程和与网络客户端通信的所有线程之间构建一个管道是最实际的。您可以使用rwlocks来移动数据,但是您仍然需要一种方法,让网络线程同时等待套接字和来自串行端口的数据,因此您需要使用文件描述符来进行这两种操作,以及类似轮询的操作


但说真的,如果没有线程,这可能会容易得多,而且性能会更好。将其视为一个主循环,它等待轮询,轮询监视网络和串行端口,确定发生的事件,并相应地分发数据。一旦你有了这个想法,一切都会变得简单。

你是说多个网络客户端正在对一个通用串行接口进行读写吗?听起来就是这样,但这也是一种奇怪的模式。就是这样。如果不奇怪的话,我相信会更容易。可悲的是,串行输入网络输出是重要的方向。另一个方向更容易,因为每个线程都会根据需要直接写入串行端口。我不确定您的设计或要求是否正确。您应该非常小心使用串行端口。您可以使用多路复用系统调用,如
poll
select
,而不是几个线程。谢谢,这是我目前正在尝试的方法,我希望有一些“内置管道或类似”的方法,我已经运行了大量的循环。只要重新阅读,考虑到环境,您可能没有标准的POSIX设施,因此管道可能不是一个选项。另一种选择是在网络套接字上中断读取等待的信号。但是假设你有某种形式的民意调查,这应该是一个相对安全的假设,我仍然会尝试完全放弃这些线程,因为我不知道它们添加了什么。谢谢。这种类型的服务器编程对我来说是新的,所以我试着慢慢来,而threads/fork是我发现的第一种处理多个连接的方法,我试着了解一下你提到的另一种方法,所以我不是fork(),而是将新套接字的fd添加到数组的某个时间,然后返回并处理数组的每个成员(读/写)?您需要一个连接数组,并且需要了解轮询接口。一旦你明白了这一点,你的事件循环只需要使用提供的函数来测试哪些FD(s)被引发并处理事件(这取决于你如何使用这些工具来创建逻辑来将事件路由到处理程序中),我认为你有四个:连接、断开连接,从串口接收和从网络客户端接收。