Boost.Asio 包含在套接字之上实现 iostreams 的类。这些类隐藏了与端点解析、协议无关性等相关的复杂性。要创建一个连接,可以简单地这样写:
ip::tcp::iostream stream("www.boost.org", "http"); if (!stream) { // Can't connect. }
iostream 类也可以与 acceptor 结合使用来创建简单的服务器。例如:
io_context ioc; ip::tcp::endpoint endpoint(tcp::v4(), 80); ip::tcp::acceptor acceptor(ios, endpoint); for (;;) { ip::tcp::iostream stream; acceptor.accept(stream.socket()); ... }
可以通过调用 expires_at()
或 expires_from_now()
来设置超时,以建立一个截止日期。任何超出截止日期的套接字操作都会将 iostream 置于“bad”状态。
例如,一个简单的客户端程序像这样:
ip::tcp::iostream stream; stream.expires_from_now(boost::posix_time::seconds(60)); stream.connect("www.boost.org", "http"); stream << "GET /LICENSE_1_0.txt HTTP/1.0\r\n"; stream << "Host: www.boost.org\r\n"; stream << "Accept: */*\r\n"; stream << "Connection: close\r\n\r\n"; stream.flush(); std::cout << stream.rdbuf();
如果所有套接字操作加起来花费的时间超过 60 秒,则会失败。
如果发生错误,可以使用 iostream 的 error()
成员函数来检索最近一次系统调用的错误代码。
if (!stream) { std::cout << "Error: " << stream.error().message() << "\n"; }
ip::tcp::iostream, basic_socket_iostream, iostreams 示例。
这些 iostream 模板只支持 char
,不支持 wchar_t
,并且不执行任何代码转换。