2011-08-31 189 views
1

我需要编写一种代理服务器,我的设计有点像这样: 1.套接字服务器(使用Windows事件选择模型)。程序有一个监听器线程监听网络事件。
2.客户列表(目前由socketid索引)。 3.套接字服务器接受一个新连接,然后为每个客户端创建一个新线程。新线程创建一个套接字连接来结束目标服务器(需要一个持久连接)。如何将消息传递给线程

我已经写了套接字服务器,工作正常。我的问题是当新的消息从客户端进入时,我如何将此消息传递到相关的线程(因此消息可以发送到目标服务器)。

在我的服务器中,我从客户端消息中获取最终目标服务器的地址。我可以从客户端套接字列表中查找客户端套接字。但是,我该如何将消息发送到正确的线程?

在我到目前为止所使用的线程中,线程函数只是运行一个循环。我是否调用线程函数,将消息作为参数传递给它?

任何人都有如何做到这一点好主意?

我可以不只是有一个客户端套接字ID和目标服务器套接字ID的地图。

接受客户端套接字后,连接到目标服务器并发送消息。将目标服务器套接字标识保存到地图中。

因此,当从客户端获取新的msg时,在映射中查找dest服务器并将消息发送到必需的服务器套接字。

其实,我是否需要使这个多线程?

+0

为什么要使用发送线程呢?只要有线程接收到客户端的'消息',就可以直接使用传出套接字。否则没有干净的机制将上下文切换到特定的线程,而不使用每个线程的队列。 –

回答

2

使用消息或同步原语,如队列,邮箱,事件信号等

例如,如果每个线程有数据的队列发送,您只需将写入该队列。队列必须是线程安全的,以允许并发访问。

0

本质上,您需要每个线程的消息队列。然后,您可以将传入数据发布到该队列中,并且该线程可以依次处理它。

有很多方法来实现这样的队列。例如,您可以使用Windows消息队列,并将Windows消息发布到目标线程拥有的窗口。或者,您可以使用自定义的线程安全消息队列来传递数据,并使用由互斥锁保护的数据结构。

0

我打算假设每个客户都需要相同的处理。所以你需要的是一堆工作线程。获得连接。拿起相关数据(互斥体)。处理。消除反应。

那么为什么每个客户端的线程。需要时构建工作线程。似乎更简单的解决方案。