2009-12-24 113 views
0

我想开发一个非常基本的客户端 - 服务器程序。客户端 - 服务器设计

一个软件读取xml(或任何数据)并将其发送给服务器,然后服务器会稍微处理它并最终将其写入磁盘。

问题是,如果我在磁盘上有很多xml文件(在我的客户端),我想打开多个连接到服务器,而不是一个一个的doint。

我的第一个问题是:假设我有一个线程保存所有的文件句柄和waitformultipleobjects,所以它会知道什么时候可以从磁盘读取其中的一个。并为每个文件我有一个适当的套接字谁假设将该特定文件发送到服务器。对于套接字,我可以使用select函数来了解哪些套接字已准备好发送。但有没有办法知道文件和appropraite套接字都准备好发送?

第二,是否有更有效的方法来设计客户端,对我目前的设计cuase,我使用的只是一个在多处理器计算机上的线程效率不够高。 (虽然我确信直到更好,然后为每个套接字连接拉扯新线程)

第三,对于服务器我读了关于反应堆模式。这似乎是合适的,但仍然像我的第二个问题一样,在使用一个线程时似乎不够高效。

也许我可以使用完成端口的东西?认为它们非常高效但从未真正使用它们,所以不知道如何。

任何答案和一般建议都会很好。

+0

请问您可以先了解一下首都 字母的简单艺术 - 每个句子开头的一个字母?这会让你的问题更具可读性。 – 2009-12-24 21:05:42

回答

2

看看boost::asio它使用基本上使用操作系统等待操作(waitforsingle/multiple,select,epoll等)的proactor模式(请参阅文档),以便非常有效地使用单个线程像你正在考虑的系统。

asio可以读取/写入文件以及套接字。您可以使用asio为文件提供异步读取,它会在完成时调用您的回调函数,然后将该读取缓冲区提交为套接字的异步写入。随着套接字完成每个挂起的写入操作,Asio将负责提供所有异步写入缓冲区。

这些操作中的每一个都是异步完成的,因此线程只是忙于启动读取或写入操作,其余时间处于闲置状态。