繁体   English   中英

C ++ TCP服务器类设计

[英]C++ TCP server Class Design

我正在使用C ++(win32 / linux)开发TCP服务器,该服务器可以满足多个客户端的需求。该服务器用于视频流传输。客户端向服务器请求视频,服务器从与摄像机连接的网关获取视频。 我被设计班困住了,我发现三个班

  1. 窥视
  2. 会议和
  3. ConnectionMgr。

因此,这里ConnectionMgr负责管理其他类。

我希望您对此有意见。

  1. 对等方和会话需要什么信息;
  2. 对等与会话之间的关系
  3. 这里需要对哪些信息进行建模。
  4. 如何做Session的维护者。
  5. 管理多个客户端将需要Threads那些线程可能需要的信息。

请提供您的反馈,以便我可以升级我的设计。

从头开始看问题空间:

  • 每个客户端之间都有某种关联状态-您似乎在Peer和Session之间分配了这种状态,如果它们的比例为1:1,我看不出任何真正的价值-可以从高级设计阶段忽略这种琐事。
    • “对等方和会话需要具备什么信息”:套接字描述符是唯一关键的事情,假设您只有一台摄像机并以相同的速度流向所有客户端(套接字套接字由于阻塞而无法完成时丢失数据,原因是完整缓冲区),否则,缓冲区也...
  • 您有一个ConnectionMgr,很好-是的,它必须侦听并接受服务器套接字上的客户端,可能为每个客户端启动一个新线程或监视当前客户端连接的集合并调度事件
  • 您需要对I / O和并发模型做出一些决策(例如选择/轮询/非阻塞,异步,阻塞,单线程,每个客户端线程,线程池等)
    • 这显然会影响您的设计:您应该确定需要-或选择-支持...

为了体会这个问题的空间,我建议您创建一个非常简单的客户端/服务器程序-如果您熟悉并熟悉多线程,则可以使用线程,否则可以通过GCC libc TCP客户端/服务器示例进行选择()的解决方案(http://www.gnu.org/s/libc/manual/html_node/Server-Example.html#Server-Example)或尝试使用boost :: asio或ACE或其他方法。 首先,只要使其工作即可,您就可以远程登录到服务器,并且在任何连接中键入的内容都会在所有连接上回显。 那应该给您足够的洞察力,以便开始提出更具体的问题。

就像@nabulke和@Jan Hudec在评论中指出的那样, Boost.Asio是解决您的问题的很好的解决方案。 看一看非常简单的示例“异步TCP Echo服务器” 它仅使用2个类: serversession 没有session_manager 通过智能指针自动管理会话,这是非常方便和简单的方法。

使用Boost.Asio,您可以使网络部分保持简单(并通过使用异步处理提高效率,几乎达到最佳状态)。 另外,添加几行代码后,您会收到多线程服务器,而没有头疼(我建议使用以下示例: “使用单个io_service和调用io_service :: run()的线程池的HTTP服务器。” ,只需忽略HTTP。东西。注意在connection类中使用boost::asio::io_service::strand

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM