【问题标题】:Boost - ASIO vs. IOStreams TCPBoost - ASIO 与 IOStreams TCP
【发布时间】:2012-06-06 03:52:32
【问题描述】:
我是 Boost 的新手。我一直在为 sokcets/networking/TCP 东西寻找一个简单的跨平台解决方案,并找到了 Boost。快速浏览一下,似乎有 两个 TCP 相关类:一个在 Iostreams 中,一个在 Asio 中。
我(非常)确定如果我深入研究两个库的各自文档,我将能够弄清楚每个库的用途,但是有人可以简要解释一下区别是什么,或者每个库的用途是什么?
【问题讨论】:
标签:
c++
boost
tcp
boost-asio
iostream
【解决方案1】:
Boost.Iostreams 中有 TCP 流吗?
ASIO 是一个完整的全功能网络库,支持使用通用回调 API 的异步 I/O。 ip::tcp::iostream 类(它是 ASIO 的一部分)构建在 ASIO 之上,隐藏了手动创建和管理套接字并提供标准 iostream 接口的大部分复杂性。
【解决方案2】:
我已使用 Boost IOStreams 轻松创建与 std::stream 兼容的流对象。您可以使用它们来创建 TCP 流类,但您将做所有工作来支持 TCP。 IOStreams 只是提供了一个框架来创建流类。
我还使用 Boost Asio 创建了一个独立的 TCP 服务器。过去使用 Windows 套接字来做同样的事情,我可以告诉你,Asio 让编写 TCP 服务器(和客户端)变得非常容易。我认为 Asio 是你想要的。
【解决方案3】:
正如其他人所说,Boost.Asio 可能是您想要的。它是系统特定网络内容的优雅且跨平台的包装器。它提供了诸如套接字、IP地址、定时器等构建块。
但它也为简单的网络交互提供了高级iostream interface。这是simple example:
#include <iostream>
#include <string>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
int main(int argc, char* argv[])
{
try
{
if (argc != 2)
{
std::cerr << "Usage: daytime_client <host>" << std::endl;
return 1;
}
tcp::iostream s(argv[1], "daytime");
if (!s)
{
std::cout << "Unable to connect: " << s.error().message() << std::endl;
return 1;
}
std::string line;
std::getline(s, line);
std::cout << line << std::endl;
}
catch (std::exception& e)
{
std::cout << "Exception: " << e.what() << std::endl;
}
return 0;
}