【问题标题】:How to handle multiple socket client through server in c linux如何在c linux中通过服务器处理多个套接字客户端
【发布时间】:2015-04-18 05:00:07
【问题描述】:

我正在尝试通过 Internet 开发服务器到多客户端应用程序。其中客户端始终连接(假设 10)。连接的客户端摘要将显示在服务器端。从该客户端列表中,我将选择特定客户端并发送一些命令来执行特定任务。之后,客户将向我发送相关输出。

如果任何客户端由于某种原因断开连接,客户端列表应该更新。

我正在尝试使用线程连接多个客户端。只有当我开发回声服务器时它才能正常工作。我试图从服务器端处理客户端,但由于无限循环接受多个客户端,我坚持处理特定的客户端和线程。

我该如何解决这个问题.....我可以使用任何好的解决方案或想法吗?还是我使用了错误的逻辑?

它类似于通过互联网连接的不同电脑之间的 IPC 机制。

【问题讨论】:

    标签: c++ multithreading sockets


    【解决方案1】:

    由于您使用的是 Linux,因此您可以使用一些异步框架(事件循环):

    这些库的一般理念是它们创建一个事件循环,就像 GUI 框架一样,并且由用户注册回调来处理与网络连接相关的事件(接受、断开连接、数据读取、数据写入。 ..) 或一般的 I/O。

    这些库效率很高,通常基于epoll api,并且隐藏了许多实现细节,因此它们相对易于使用。

    【讨论】:

      【解决方案2】:

      看看select()。它便携且高效,插座数量少。你可以找到一个例子here

      【讨论】:

        【解决方案3】:

        看起来你现在正在做的是你正在使用阻塞 IO。这样,您通常只能处理一个客户端,因为每次对 recv/accept/send 的调用都会阻塞,直到接收/发送一些数据。您可以在不需要线程的情况下解决这个问题,就是让这些调用成为非阻塞的。如果您想破解一些 c,您可以通过在服务器套接字上调用 fcntl 来更改当前代码以变为非阻塞。完成后,您可以有一个循环,您可以依次调用accept()send()/recv(),它们将立即返回。不同之处在于,如果他们没有任何数据给你,他们会有一个特殊的返回值。检查接受等的手册页以找到这些值。有关更多信息,您可以查看http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html,它涵盖了 linux 中的大多数套接字编程。如果您想更进一步,您还可以查看 nouney 提到的 select() 。它将使您能够拥有一组连接到的套接字,它会告诉您可以接收/发送哪些套接字以及是否有任何新的挂起连接。

        如果您想使用线程模型,您仍然可以保持套接字阻塞,请注意,如果您为每个传入连接创建一个新线程,这将很快开始使用资源,这可能不是您想要做的.您还必须在线程之间进行一些同步,因为我猜您还希望它们以某种方式相互通信。

        另一方面,如果您不想降低级别,则可以使用 SirDarius 建议的一些替代方案。 Boost::ASIO 似乎对 c++ imo 做得很好,并且不需要您创建任何新线程 iirc。

        如果您之前没有做过任何套接字编程,但我建议您查看 Beejs 指南并使用它创建一些基本功能,只是为了学习体验。

        【讨论】:

          猜你喜欢
          • 2015-10-01
          • 2018-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-09
          • 2014-01-08
          • 1970-01-01
          相关资源
          最近更新 更多