五、流式操作
许多IO对数据的操作是按流式来进行的,为此Asio提供了流式操作,如上面的streambuf。对最典型的是TCP流,提供了ip::tcp::iostream。下例是一个简单的示例。
void iostreamclient(int argc , char* argv[])
{
boost::asio::ip::tcp::iostream stream;
stream.expires_after(std::chrono::seconds(20));
try
{
stream.connect(argv[1], argv[2]);
std::cout<<"connected"<<argv[1]<<" "<<argv[2]<<std::endl;
char buf[256];
std::cin>>buf;
stream <<buf;
stream.flush();
std::cout <<"Send["<<strlen(buf)<<"]:"<<buf<<std::endl;
memset(buf,0,sizeof(buf));
stream>>buf;
std::cout<<"Recv:"<<buf<<std::endl;
}
catch (std::exception& e)
{
std::cout << e.what() << ",exits"<<std::endl;
}
}
这个示例中,一次性发送给服务器端内容,并从服务器端接收应答内容,风格完全是流式数据输入输出的样式。由于iostream中采用了streambuf,其内存分配是一次性固定的,所以并不适合多次使用。
总的说,iostream虽然使用起来比较方便,但“控制力”太弱,比较适合做一些测试工具等要求不高的场合。
六、栈式/非栈式协程
见作者的上一篇博文。
七、对TCP/UDP/ICMP的支持
TCP, UDP ,ICMP是tcp/ip族中用来通讯的三个协议,Asio分别提供了ip::tcp::socket, ip::udp::socket,ip::icmp::socket对它们直接进行了支持,当然还有些辅助类,例如address,endpoint和resolver类,常用的就这么些。但实际上,Asio为了更好的兼任性以及扩展方便,抽象出好多基类,它们一般情况下并不直接使用,而是对库开发者有效。