2012-12-26 48 views
0

我写的音频流光(客户端 - 服务器)矿山(C/C++)的项目, 和我决定线程UDP服务器这一个多项目。问题实现多线程UDP服务器(线程池?)

这背后的逻辑是,每个客户端将在自己的线程来处理。 我遇到的问题是线程互相干扰。

我的服务器做的第一件事是创建一种线程池;它创建5个 线程,所有由recvfrom()功能自动封锁, 虽然看似是,在大多数时候我另一台设备 连接到服务器,多个线程响应,后来 导致服务器时代完全阻止,不能进一步操作。

这是非常困难的,所以我在这里写为了 获得多线程UDP服务器是如何实现的,通常一些建议来调试这一点。

我应该使用一个互斥体或信号代码的一部分吗?如果是这样,在哪里?

任何想法都会非常有帮助。

回答

0

你recvfrom的,应在主线程和当它得到的数据,你应该通过地址IP:端口和UDP客户端的数据传输到辅助线程。

薪火IP:端口和数据可以通过生成一个新的线程,每次主线程来完成接收UDP数据包,也可以通过消息队列传递到辅助线程

+0

感谢您的评论康莱德! 但如果recvfrom函数将在主线程独自一人,怎么可能当我们说我的服务器上获取数据 - 4个客户机发送出去一次,就它没有任何问题? –

+0

每个UDP客户端都被分配一个助手线程。基于UDP IP和客户端端口的客户端映射将由主线程维护。在接收数据时,将使用IP和端口将数据转发到正确的线程。 –

+0

recvfrom函数只接收来自客户端的UDP数据。它维护一个线程ID表以及每个线程负责的相应客户端源IP和端口的映射。如果收到一个新数据包并且表中没有条目,则可以创建一个新线程并在该表中分配一个新条目,并将数据连同客户端IP和端口一起传递给该线程以发送回复。如果收到新的数据包并且表中已经有映射,则数据通过消息队列传递给该线程。 –

0

我认为你的主要问题是非持久udp连接。 Udp不会保持连接的活跃,每个会话只交换两个数据报。根据您的应用程序,在最坏的情况下,它将从第一个可用信息中读取并发线程,即即使轮到它,recvfrom()也会解除阻塞。

我想,走在主线程中使用选择,具有并行缓冲,管理什么至极线程会做的方式。 在此解决方案中,假设您保留客户端必需的信息以确保发送正确的文件部分,则每个客户端可以有一个线程或每个文件有一个线程。

TCP是另一种方式来做到这一点,因为它让你运行的每个线程活着的连接,而不是在失去了允许的应用程序数据的最佳传播途径。

1

我的伺服器第一件事呃确实是创建了一种线程池;它创建了5个线程,所有线程都被recvfrom()函数自动阻塞,但似乎在大多数情况下,当我将另一个设备连接到服务器时,多个线程都会响应,并且稍后会导致服务器成为完全堵塞和不超过其所有的线程坐在一个recvfrom的()同一个套接字连接上进一步操作

相反,你应该保护与信号的连接,让您的工作线程等待信号量。当一个线程获得信号量时,它可以调用recvfrom(),当它返回一个数据包时,线程可以释放信号量(用于获取另一个线程)并处理数据包本身。当它完成数据包的服务后,它可以返回等待信号量。这样可以避免在线程之间传输数据。