boost asio库的学习总结(1)

asio库介绍

ASIO库能够使用TCP、UDP、ICMP、串口来发送/接收数据,下面先介绍TCP协议的读写操作。对于读写方式,ASIO支持同步和异步两种方式。是基于proactor的。

io_service

程序至少需要一个 io_service 实例。Boost.Asio 使用 io_service 同操作系统的输入/输出服务进行交互。通常一个 io_service 的实例就足够了。
boost::asio::io_service io;

asio库的定时器写法

阻塞式
boost::asio::io_service io;//这个是boost必须要有的,是下面的定义绑定再谁身上   
//定义5秒钟,这个时间类和chnoro有点像,不过这个更多于时间区之类的
boost::asio::deadline_timer t(io,boost::posix_time::seconds(5));
t.wait();//上面的那个io,其实有两种方式,一种阻塞式,一种非阻塞式
//这种写法就是阻塞式
std::cout<<"到我这里了"<<std::endl;

非阻塞式

voidcallback(constboost::system::error_code& )
{
 std::cout<< "hello" << std::endl;
}
int main()
{
boost::asio::io_service io;
boost::asio::deadline_timer t(io,
boost::posix_time::seconds(5));
t.async_wait(callback);//这段代码相当于是注册,把这个函数指针代入,5秒后返回
 std::cout<< "开始执行io.run\n";
io.run();//这个相当于是死循环,只有两种情况才会退出,一种是调用stop函数,一种是事件池空了
//可见,这个callback是在run里面执行的
std::cout<< "结束执行io.run";
  return 0;
}

定时器其实这个在网络编程也经常会用到。比如心跳包之类的。

socket TCP连接写法(同步)

服务器
int main()
{
using namespace boost::asio;//太长写个这个,真正编程最好少有
io_service iosev;//这是必须要有的
ip::tcp::acceptor acceptor(iosev,ip::tcp::endpoint(ip::tcp::v4(), 1000));
//这个可以理解为基于ip、tcp的服务器接收器,第一个参数就是需要通过这个接口和操作系统打交道
//第二个参数就是基于ip、tcp的端点,这个端点端口号是1000,属于ipv4,本机ip。
for(;;)//死循环可以一直接收下一个用户的连进
{
   // 定义一个socket对象,就是把连接操作当做对象的操作。
   ip::tcp::socket socket(iosev);
   // 等待直到客户端连接进来
  acceptor.accept(socket);
  // 显示连接进来的客户端的地址和端口
  std::cout << socket.remote_endpoint().address() << std::endl;
  std::cout << socket.remote_endpoint().port() << endl;
 // 向客户端发送数据
  boost::system::error_code ec;
  socket.write_some(buffer("welcone to asio server"), ec);
  if (ec)//如果是错误代码就输出
  {
   std::cout <<boost::system::system_error(ec).what() << std::endl;
   break;
  }
  // 与当前客户交互完成后循环继续等待下一客户连接
 }
 return 0}
客户端
using namespace boost::asio;
io_service iosev;
ip::tcp::socket socket(iosev);
ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 1000);
 //本机测试使用回路地址
 boost::system::error_code ec;
 socket.connect(ep, ec);
 // 如果出错,打印出错信息
 if (ec)
 {
  std::cout << boost::system::system_error(ec).what() << std::endl;
  return -1;
 }
 // 接收数据
 char buf[100];
 size_t len = socket.read_some(buffer(buf), ec);
 std::cout.write(buf, len);

总结:
1、给我的感觉就是用了类来封装socket的函数,但是添加了很多的功能,这样的写法比传统的抽象。
2、socket是服务器与客户端通信的桥梁,io_service是用户和操作系统交互桥梁。
3、ASIO的TCP协议通过boost::asio::ip名空间下的tcp类进行通信。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值