【问题标题】:Writing to different sockets in the same time using async_write使用 async_write 同时写入不同的套接字
【发布时间】:2016-02-06 22:14:30
【问题描述】:

我想写服务器(TCP/IP),但我有一些问题,因为我不确定我的想法是否正确。

我需要一台只有一个线程的服务器。我需要向某些客户端读取和写入数据。我想使用来自boost::asioasync_acceptasync_writeasync_read 等。

不同客户同时拨打async_write可以吗?如果我的程序为一个客户端调用 async_write 而在调用处理程序之前它为另一个客户端调用 async_write 怎么办?

关于async_read的同样问题。

没有问题吗?

是否保证(在这种情况下)第一次调用async_write 的回调将在第二个async_write 的回调之前调用?

如果某个回调(处理程序)需要很长时间怎么办?其他回调只是在堆栈中等待,直到这个回调完成?如果这个回调永远不会结束另一个回调将永远不会执行?我说的对吗?

【问题讨论】:

    标签: c++ asynchronous boost network-programming boost-asio


    【解决方案1】:

    对不同套接字的重叠异步读写调用没有问题。我建议您为每个连接提供自己的链,以便将来在您决定添加 TLS 支持或使用多个线程时不会中断。可以按任何顺序调用完成处理程序,具体取决于操作实际完成的顺序。当然,你不能在同一个连接上同时进行两个异步读取操作或两个异步写入操作。

    【讨论】:

      【解决方案2】:
      • 不,这不是问题。
      • 不,没有保证。
      • 不,回调不应相互等待。
      • 不,你错了。

      每个套接字的套接字 I/O 独立进行。

      【讨论】:

      • 如果在我的程序中首先调用的某些回调/处理程序(来自 async_write)永远不会完成,那么其他回调怎么可能被执行?回调在一个线程上是异步的?
      • 不,你假设。它们是异步的,周期。 “一根线”是你自己的发明。
      • 异步操作完成后才会执行回调。
      • @peter55555 您可以创建任意数量的线程。 1、2 或更多。你不应该在回调中做任何比你绝对必须做的更多的工作。如果您遇到的情况是回调可能需要很短的时间,那么您可能做错了什么。
      • 老实说,我无法弄清楚你在问什么。回调应该尽可能少。如果您有可能需要花费大量时间的事情要做,那么回调不是执行此操作的正确位置。如果需要,io_service 可以只有一个线程,也可以有多个线程。如果你只有一个线程,并且你的回调阻塞,那么你就不能做任何其他事情,所以只有一个线程并在你的回调中做“真正的工作”是一个可怕的设计。
      猜你喜欢
      • 2011-05-06
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 2013-07-10
      • 2017-09-07
      • 2012-10-12
      • 1970-01-01
      相关资源
      最近更新 更多