【问题标题】:Boost asio - synchronous write / read - how to do?Boost asio - 同步写/读 - 怎么办?
【发布时间】:2017-09-23 16:03:49
【问题描述】:

首先,我想说我是 Boost asio 的新手,我看到了很多例子,但我仍然不明白。

我想创建一个服务器,它将接受两个客户端(它将使用两个套接字)。第一个客户端将向服务器发送消息,服务器将向另一个客户端发送此消息(是的,使用服务器是没有用的,但这不是重点,我想了解这一切是如何工作的)。这将一直发生,直到其中一个客户端关闭。

所以,我创建了一个服务器,服务器等待客户端,然后,它必须等待第一个客户端发送一些消息。这是我的问题:之后我必须做什么?

我以为我需要读取第一个套接字,然后在第二个套接字上写入,等等,但是我怎么知道第一个客户端是否在套接字上写入?同样,我怎么知道第二个客户端是否读取了第二个套接字?

我不需要代码,我只想知道这样做的好方法。

非常感谢阅读!

【问题讨论】:

    标签: c++ sockets boost boost-asio


    【解决方案1】:

    当您执行 async_read 时,您指定了一个回调,当任何数据被读取到缓冲区时都会调用该回调(您还应该提供缓冲区,请查看 async_read 的文档)。您应该分别为 async_write 提供回调,以了解您的数据何时已发送。因此,从服务器的角度来看,对于“写入”的客户端,您应该执行 async_read,而对于“读取”的第二个客户端,您应该执行异步写入。使用提供的数据流 client1->server->client2 很难识别服务器应该从哪个客户端读取以及写入哪个客户端。由你决定。例如,您可以选择第一个连接的客户端作为写入器,第二个作为读取器。

    您可能想从 asio iostreams 开始。它是异步套接字之上的一种类似于 iostream 的高级抽象。

    P.S.:另外,不要忘记在某处运行 io_service.run() 循环。因为所有的 asio 回调都是在那个循环中执行的。

    【讨论】:

    • 好的,我明白了。但是在我的情况下,我可以进行同步读/写吗,因为服务器可以等待客户端,然后当它收到一些东西时,发送给另一个客户端?
    • 您也可以使用阻塞 asio::read/asio::write 函数,但与berkley sockets相比它不会增加太多功能,所以我认为使用它不是一个好主意asio 用于阻塞 io。在这种情况下,我会使用传统的伯克利插座。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多