设计多客户端tcp服务器以处理数据

时间:2013-11-04 03:37:37

标签: c++ multithreading sockets networking tcp

我正在尝试重写我当前的项目以包含更多功能和稳定性,并需要一些帮助来设计它。这是它的主旨(对于linux):

  • TCP_SERVER接收连接(auth数据包)
  • TCP_SERVER启动一个新的(线程/分叉)来处理新客户端
  • TCP_SERVER将从客户端接收许多数据包>这将被添加到循环缓冲区
  • 将为该客户端创建一个单独的线程来处理这些数据包并构建一个对象列表
  • 应创建另一个线程以将对象列表的一部分发送到另一个客户端

将所有处理分成线程的原因是因为服务器将获得许多数据包并且处理将无法跟上(这需要快速,因为它的时间敏感)(我不确定tcp是否会丢弃数据包如果内部缓冲区太大了?),另一个线程要发送到另一个客户端以尽可能快地保持处理。

因此,对于每个新连接,应创建3个线程。 1接收数据包,1接收数据包,1发送处理数据到另一个客户端(技术上只是在不同设备上的人/ IP)

我需要帮助设计这个,如何构建它,使用什么(forks / threads),使用什么库。

2 个答案:

答案 0 :(得分:0)

尝试自己做这件事会让你感到痛苦。专注于您的实际应用程序,并利用现有的套接字处理框架。例如,你说:

  

对于每个新连接,应创建3个线程

该声明说明如下: 1.您之前没有大规模地完成此操作,并且没有意识到所有这些线程将产生的影响。 2.您从未对线程创建或同步操作进行基准测试。 这种方法可能出错的事情数量非常多。

认真考虑使用现有的库来完成大部分工作。在这周围使用脚手架可能需要花费数年的时间,而且你最好专注于你的代码,而不是所有的随机管道。

Boost C++ libraries似乎有一个很好的Async C ++套接字处理基础架构。将此与一些现有的C ++线程池相结合,您可能会很快获得高性能的解决方案。

我还会质疑你对C ++的使用。 Java和C#都可以很好地实现高度可扩展的套接字服务器,而一些更高级别的语言工具(Spring,Guarva等)可能非常非常有价值。如果你想通过TLS或其他机制确保这一点,你也可能在Java或C#中比在C ++中更容易找到它。

您将关注的一些主要事项: 1.真正的异步I / O将是一个巨大的性能和可扩展性的胜利。试着这么做很难。 boost asio library看起来很不错。 2.专注于您的功能和稳定性,而不是构建新的套接字处理平台。 3.线程很昂贵,避免创建它们。线程池是你的朋友。

答案 1 :(得分:0)

您计划为服务器处理的每个连接创建一个或多个线程。线程不是免费的,它们带有内存和CPU开销,当你有许多活动线程时,你也开始有资源争用。

您期望使用哪种使用模式?你是否期望当你有8个连接时,所有8个网络线程将消耗100%的cpu核心推/拉数据包?或者你认为它们的周转率相对较低?

当您添加更多主题时,您将不得不花费更多时间来竞争互联网等资源。

更好的模式是为网络io提供一个或多个线程 - 大多数操作系统都有说“告诉我这些网络连接中的一个或多个有io”的机制,这样可以提高效率,而不是拥有大量单独的线程只为一个连接做同样的事情。

然后进行实际处理,启动工作线程池以进行实际工作,从而最大限度地减少对资源的竞争。您可以监控工作负荷,以确定是否需要增加更多以满足交付要求。

您可能还想查找一些内容来为您实现网络IO基础架构;我使用libevent获得了非常好的性能结果,但之后我只需处理非常高性能/可靠性的网络系统。