Socket输入输出流
Asio在socket的顶层封装上实现了输入输出流。这种实现隐藏了端点和协议的复杂性。你想实现一个连接可以如此简单:
ip::tcp::iostream stream("www.boost.org", "http");
if(!stream)
{
// Can't connect.
}
输入输出流可以用以构建简单的服务器:
io_service ios;
ip::tcp::endpoint endpoint(tcp::v4(), 80);
ip::tcp::acceptor acceptor(ios, endpoint);
for(;;)
{
ip::tcp::iostream stream;
acceptor.accept(*stream.rdbuf());
...
}
超时的配置需要调用expires_at()或者expires_from_now()来设定一个截止时间,所有的socket操作,一旦发生了超过截止时间的情况,会导致输入输出流改变状态到“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();
在socket操作超过了60s后,这个输出流操作就会失败。
一旦这种错误发生,就会被记录高stream的error code中,后者会记录最近的一次异常调用。
if(!stream)
{
std::cout << "Error: " << stream.error().message() << "\n";
}
参见
ip::tcp::iostream, basic_socket_iostream, iostreams examples
注意
这种输入输出流只能支持char,不支持wchar_t,也不支持任何的字符转换。