boost.asio
asio: 异步输入/输出。
asio提供了可移植的同步或异步的I/O操作,它提供了一个现代C++风格的网络编程接口,支持TCP,UDP,ICMP等网络通信协议。
同步模式:程序发起一个I/O操作,向io_context提交请求,io_context将操作交给操作系统,同步等待。当I/O操作完成之后,操作系统会通知io_context,然后io_context再将结果发回给程序。
异步模式: 程序发起提供I/O操作,并提供一个回调函数,io_context把操作交给操作系统后,立即返回,不同步等待。调用io_context的**run()**函数可以等待异步操作完成,当异步操作完成时,io_context从操作系统获取结果,再调用回调函数。
UDP:
建立通信的步骤:
- 创建io_context对象。asio的任何操作都需要io_context的参与。
boost::asio::io_context io;
- 创建socket,socket对象需要用io_context初始化。
boost::asio::ip::udp::socket sock(io);
- 创建端点(ip地址,端口),对于服务端,这是创建自身开放的端点。对于服务端就是需要到的服务端的端点。
boost::asio::ip::udp::endpoint server_point(boost::asio::ip::address::from_string("127.0.0.1"), 8989);
- 套接字打开打开端口。
sock.open(server_point.protocol());
- 对于服务端还需要这一步。绑定端点。
sock.bind(server_point);
- 对于客户端可以有这一步。与服务端建立连接。
connect(server_point);
一般情况,udp通信的步骤是,建立连接,发送/接收数据,断开连接,... ,建立连接, 发送/接收数据, 断开连接,...
,通过connect
,第一,我们可以选择与哪个服务端建立连接,第二,与服务端建立一个较长期的连接。建立连接,发送/接收数据,... ,发送/接收数据, 断开连接
。效率会更高。 - 对于异步操作,一定要调用run()函数,执行事件循环.
通过以上几步就能建立一个UDP连接,然后通过同步发送、接收,