【问题标题】:client-server design客户端-服务器设计
【发布时间】:2009-12-24 20:05:10
【问题描述】:

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

一个软件读取 xml(或任何数据)并将其发送到服务器,服务器再对其进行一点操作并最终将其写入磁盘。

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

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

其次,有没有更有效的方法来设计客户端,因为在我当前的设计中,我只使用一个线程,在多处理器计算机上效率不够高。 (尽管我确信为每个套接字连接启动新线程会更好)

第三,对于服务器,我阅读了有关反应器模式的信息。看起来很合适,但就像我的第二个问题一样,在使用一个线程时似乎还不够高效。

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

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

【问题讨论】:

  • 能否请您学习一些简单的大写字母艺术 - 每个句子的开头都有一个?这将使您的问题更具可读性。

标签: c++ windows networking client-server


【解决方案1】:

看看boost::asio 它使用了一个前摄器模式(参见文档),它基本上使用操作系统等待操作(waitforsingle/multiple、select、epoll 等)来非常有效地使用单线程在您正在考虑实施的系统中。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多