将相同的信息发送到多个线程/套接字?

时间:2012-01-01 03:17:34

标签: c linux multithreading sockets pipe

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

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

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

3 个答案:

答案 0 :(得分:1)

听起来您需要为每个连接的客户端提供数据队列(缓冲区)。每次数据进入端口时,都会将其发布到每个客户端队列的后面。然后,客户端从各自队列的前面读取数据。由于所有客户端可能会以不同的速率/次数读取,这将确保所有客户端只获取一次数据副本,并且当更多数据进入时,您不会挂断等待任何一个客户端。当然,你需要为每个连接的客户端队列分配一定数量的内存(我不确定你期望有多少客户端,你确实说你的可用内存是有限的),你需要考虑如果要做什么在客户端读取所有内容之前,队列已满。

答案 1 :(得分:0)

据推测,你保留了连接客户端的列表或其他参考,为什么不为每一位信息循环并将其发送给所有信息呢?

答案 2 :(得分:0)

每个套接字设计的线程可能不是解决此问题的最佳方法。事件驱动的异步方法应该更合适。但是,如果必须使用线程,并且假设串行端口速度很慢,则在侦听串行端口的线程与所有与网络客户端通信的线程之间构建管道是最实用的。你可以使用rwlock来移动数据,但你仍然需要一种方法让网络线程在套接字和串口数据上等待,所以你需要使用文件描述符来实现这两者轮询。

但严重的是,这可能会更容易,并且在没有线程的情况下表现更好。可以把它想象成一个等待轮询的主循环,它正在观察网络和串口,确定发生了哪个事件,并相应地分配数据。一旦你明白这一点,它应该更容易。