【问题标题】:c++ socket programming: creating multiple streamsc++ socket编程:创建多个流
【发布时间】:2018-05-12 03:29:01
【问题描述】:

我正在开发一个应用程序,以便在创建套接字后以侦听器和调用者模式启动多个流。现在,如果我启动一个流,进程就会挂起,因为流正在等待数据。所以我很清楚,我需要以异步方式启动流,以便应用程序的其余部分继续工作。

我是否在以下位置开始直播:

  • 单独的线程
  • 使用 fork 分离进程
  • 还阅读了有关 select 的内容,这会起作用吗
  • 阻塞/非阻塞套接字能解决这个问题吗?

这个应用程序是用 C++ 完成的。

【问题讨论】:

    标签: c++ sockets stream


    【解决方案1】:

    您可以使用 Boost.Asio 之类的库或 C 函数 poll()(或基本相同的 select())同时等待多个套接字。无论哪种方式,您都希望“多路复用”套接字,这意味着您阻塞直到其中任何一个有可用数据,然后您从那个套接字读取。这就是构建的网络应用程序的数量,通常比为每个连接都有一个线程或进程更高效、更可扩展且更不容易出错。

    【讨论】:

    • 但是当我以阻塞模式启动连接时,程序就在那里等待。而我需要通过程序添加更多连接。如果我在非阻塞模式下创建套接字,那么它会进行轮询,但会给出没有数据可供读取的错误,并关闭连接而我需要在数据进入时保持连接处于打开状态。
    • "没有可读取的数据" (EAGAIN) 如果套接字是非阻塞的,则不是错误。只需轮询直到有可用数据,不要从未标记为就绪的套接字中读取。
    • 感谢约翰的回复。这是我第一次尝试套接字编程,因此提出了这些(也许是愚蠢的)问题。因此,我创建了非阻塞套接字(通过 webapp),并为“选择”编写了一个单独的监控程序,该程序处于无限循环中。可以吗,还是监控程序必须只是 webapp 的一部分?在 webapp 中如何创建套接字,如果是,当建立连接时我现在如何生成,
    • 请忽略以上内容,改写:谢谢约翰的回复。这是我第一次尝试套接字编程,因此提出了这些(也许是愚蠢的)问题。因此,我创建了非阻塞套接字(通过 webapp),并为“选择”编写了一个单独的监控程序,该程序处于无限循环中。可以吗,还是监控程序必须只是 webapp 的一部分?创建的套接字号被写入文件,两个进程(webapp 和监控应用程序)都可以读取该文件,但它可以这样工作吗?这样创建的 Socket 是否可以超出应用程序的范围?
    • 另一个问题是,如果我必须在同一个应用程序中运行无限循环,那么考虑到应用程序是 web 应用程序,其余的如果应用程序有其他功能要做。非常感谢您迄今为止在指导我正确方向方面的所有帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    相关资源
    最近更新 更多