Boost asio:是否可以将接受的 tcp 套接字转换为 basic_socket_iostream (或以某种方式从中获取它)?
所以这是我的问题:我们已经接受
一个 boost asio tcp 套接字。我们所有的 API 都使用它。我们只需要在一个函数中执行这样的“超时读取”即可。
可以执行此类“超时读取”,如下所示 这里。但是我从我的 API 中获得了 boost asio tcp 套接字,所以我想知道是否有可能将 Boost::asio 套接字变成 basic_socket_iostream。怎么做呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以使用
tcp: :iostream::rdbuf()
获取指向socket::basic_socket_streambuf
的指针然后分配()< /code>
描述符。
虽然这非常很复杂,但我强烈建议不要走这条路。作为拉尔夫的回答表明了,并且我对您所建议的链接问题的回答,您确实应该为此使用
deadline_timer
。you can use
tcp::iostream::rdbuf()
to get a pointer to thesocket::basic_socket_streambuf
thenassign()
the descriptor.Though this is very convoluted and I strongly suggest not going this route. As Ralf's answer indicated, and my answer to your linked question suggested, you really should be using a
deadline_timer
for this.您没有说明是否要求不使用异步 API,因此这可能对您有帮助,也可能不会:
除非我误解了您,否则我认为您引用的 SO 答案正在考虑不同的用例,即使用 tcp 超时::iostream。如果您只是想为读取添加超时,请查看 asio 文档中的超时示例?这是使套接字操作超时的标准方法。
You don't state whether there is a requirement not to use the asynchronous APIs so perhaps this helps you and perhaps not:
Unless I'm misunderstanding you, I think the SO answer you reference is looking at a different use case i.e. timeout using tcp::iostream. If you simply want to add a timeout to a read, have you looked at the timeout examples in the asio documentation? This is the standard approach to timeout a socket operation.
对于遇到此问题的其他人,在尝试使其工作几个小时后,我决定使用 Boost“Devices”编写一个简单的包装类:
http://www.boost.org/ doc/libs/1_64_0/libs/iostreams/doc/tutorial/container_source.html
使用示例:
For anyone else who will come across this problem, after trying to get this working for hours I decided to write a simple wrapper class using Boost "Devices":
http://www.boost.org/doc/libs/1_64_0/libs/iostreams/doc/tutorial/container_source.html
usage example: