boost asio 简单示例
客户端:
- #include <iostream>
- #include <boost/asio.hpp>
- #include <boost/bind.hpp>
- #include <boost/shared_ptr.hpp>
- #include <boost/enable_shared_from_this.hpp>
- using boost::asio::ip::tcp;
- using boost::asio::ip::address;
- class session: public boost::enable_shared_from_this<session> {
- public:
- session(boost::asio::io_service &io_service, tcp::endpoint &endpoint)
- : io_service_(io_service), socket_(io_service), endpoint_(endpoint)
- {
- }
- void start() {
- socket_.async_connect(endpoint_,
- boost::bind(&session::handle_connect,
- shared_from_this(),
- boost::asio::placeholders::error));
- }
- private:
- void handle_connect(const boost::system::error_code &error) {
- if (error) {
- if (error.value() != boost::system::errc::operation_canceled) {
- std::cerr << boost::system::system_error(error).what() << std::endl;
- }
- socket_.close();
- return;
- }
- static tcp::no_delay option(true);
- socket_.set_option(option);
- strcpy(buf, "Hello World!\n");
- boost::asio::async_write(socket_,
- boost::asio::buffer(buf, strlen(buf)),
- boost::bind(&session::handle_write,
- shared_from_this(),
- boost::asio::placeholders::error,
- boost::asio::placeholders::bytes_transferred));
- }
- void handle_write(const boost::system::error_code& error, size_t bytes_transferred) {
- memset(buf, sizeof(buf), 0);
- boost::asio::async_read_until(socket_,
- sbuf,
- "\n",
- boost::bind(&session::handle_read,
- shared_from_this(),
- boost::asio::placeholders::error,
- boost::asio::placeholders::bytes_transferred));
- }
- void handle_read(const boost::system::error_code& error, size_t bytes_transferred) {
- std::cout << buf << std::endl;
- }
- private:
- boost::asio::io_service &io_service_;
- tcp::socket socket_;
- tcp::endpoint &endpoint_;
- char buf[1024];
- boost::asio::streambuf sbuf;
- };
- typedef boost::shared_ptr<session> session_ptr;
- int main(int argc, char* argv[])
- {
- boost::asio::io_service io_service;
- tcp::endpoint endpoint(address::from_string("192.168.1.1"), 10028);
- session_ptr new_session(new session(io_service, endpoint));
- new_session->start();
- io_service.run();
- return 0;
- }
服务器:
- #include <string.h>
- #include <boost/asio.hpp>
- #include <boost/bind.hpp>
- #include <boost/shared_ptr.hpp>
- #include <boost/enable_shared_from_this.hpp>
- using boost::asio::ip::tcp;
- using boost::asio::ip::address;
- class session: public boost::enable_shared_from_this<session> {
- public:
- session(boost::asio::io_service &io_service): socket_(io_service)
- {
- }
- void start() {
- static tcp::no_delay option(true);
- socket_.set_option(option);
- boost::asio::async_read_until(socket_,
- sbuf_,
- "\n",
- boost::bind(&session::handle_read,
- shared_from_this(),
- boost::asio::placeholders::error,
- boost::asio::placeholders::bytes_transferred));
- }
- tcp::socket &socket() {
- return socket_;
- }
- private:
- void handle_write(const boost::system::error_code& error, size_t bytes_transferred) {
- boost::asio::async_read_until(socket_,
- sbuf_,
- "\n",
- boost::bind(&session::handle_read,
- shared_from_this(),
- boost::asio::placeholders::error,
- boost::asio::placeholders::bytes_transferred));
- }
- void handle_read(const boost::system::error_code& error, size_t bytes_transferred) {
- boost::asio::async_write(socket_,
- sbuf_,
- boost::bind(&session::handle_write,
- shared_from_this(),
- boost::asio::placeholders::error,
- boost::asio::placeholders::bytes_transferred));
- }
- private:
- tcp::socket socket_;
- boost::asio::streambuf sbuf_;
- };
- typedef boost::shared_ptr<session> session_ptr;
- class server {
- public:
- server(boost::asio::io_service &io_service, tcp::endpoint &endpoint)
- : io_service_(io_service), acceptor_(io_service, endpoint)
- {
- session_ptr new_session(new session(io_service_));
- acceptor_.async_accept(new_session->socket(),
- boost::bind(&server::handle_accept,
- this,
- new_session,
- boost::asio::placeholders::error));
- }
- void handle_accept(session_ptr new_session, const boost::system::error_code& error) {
- if (error) {
- return;
- }
- new_session->start();
- new_session.reset(new session(io_service_));
- acceptor_.async_accept(new_session->socket(),
- boost::bind(&server::handle_accept,
- this,
- new_session,
- boost::asio::placeholders::error));
- }
- void run() {
- io_service_.run();
- }
- private:
- boost::asio::io_service &io_service_;
- tcp::acceptor acceptor_;
- };
- int main(int argc, char* argv[])
- {
- boost::asio::io_service io_service;
- tcp::endpoint endpoint(address::from_string("192.168.1.1"), 10028);
- server s(io_service, endpoint);
- s.run();
- return 0;
- }
编译:
g++ -Wall -o client client.cpp -lboost_system
g++ -Wall -o server server.cpp -lboost_system
这里需要注意的是: async_write, async_read, async_read_until 都是需要达到特定条件才会调用回调函数,
在调用回调函数之前, 不能再次调用, 否则接收到的数据很可能是乱的. 所以, 在实际代码当中, 会有一个写缓冲队列, 当需要write的时, 先放到队列中, 如果队列个数为1, 则调用async_write, 否则等待函数回调, 当函数回调时将首个元素从队列中移除, 然后接着发送下一个, 直到队列为空.
对于client, 由于is_open在async_connect之后就是true状态了, 因此在async_connect回调返回之前没有方法知道是否已经连接成功, 实际代码当中一般会增加一个变量以表示该套接字是否已经允许发送数据.
boost asio 简单示例相关推荐
- Boost.Asio入门
原文地址:https://mmoaay.gitbooks.io/boost-asio-cpp-network-programming-chinese/content/Chapter1.html Boo ...
- Boost:组合异步操作的简单示例
Boost:组合异步操作的简单示例 实现功能 C++实现代码 实现功能 boost::asio模块,组合异步操作的简单示例 C++实现代码 #include <boost/asio/io_con ...
- BOOST使用 proto::extends 扩展终端类型的简单示例
BOOST使用 proto::extends 扩展终端类型的简单示例 实现功能 C++实现代码 实现功能 BOOST使用 proto::extends 扩展终端类型的简单示例 C++实现代码 #inc ...
- BOOST使用 proto 转换进行任意类型操作的简单示例
BOOST使用 proto 转换进行任意类型操作的简单示例 实现功能 C++实现代码 实现功能 BOOST使用 proto 转换进行任意类型操作的简单示例 C++实现代码 #include <i ...
- boost::proto模块实现构建算术表达式的简单示例 带有占位符的评估器的测试程序
boost::proto模块实现构建算术表达式的简单示例带有占位符的评估器的测试程序 实现功能 C++实现代码 实现功能 boost::proto模块实现构建算术表达式的简单示例带有占位符的评估器的测 ...
- boost::math模块演示负二项分布使用的简单示例的测试程序
boost::math模块演示负二项分布使用的简单示例的测试程序 实现功能 C++实现代码 实现功能 boost::math模块演示负二项分布使用的简单示例的测试程序 C++实现代码 #include ...
- 使用 Boost.Math 计算 Jacobi Zeta 函数的简单示例, 并使用相应的 WolframAlpha 命令
使用 Boost.Math 计算 Jacobi Zeta 函数的简单示例, 并使用相应的 WolframAlpha 命令 实现功能 C++实现代码 实现功能 使用 Boost.Math 计算 Jaco ...
- boost::math模块计算二项式随机变量的概率和分位数的简单示例
boost::math模块计算二项式随机变量的概率和分位数的简单示例 实现功能 C++实现代码 实现功能 boost::math模块计算二项式随机变量的概率和分位数的简单示例 C++实现代码 #inc ...
- boost::icl模块interval_map 的最简单示例是重叠计数器
boost::icl模块interval_map 的最简单示例是重叠计数器 实现功能 C++实现代码 实现功能 boost::icl模块interval_map 的最简单示例是重叠计数器 C++实现代 ...
最新文章
- <马哲>科学技术在社会发展中的作用2017-12-27
- 存储世界瞬息万变 SSD掀行业浪潮
- 04-图像的形状绘制
- linux系统进程类型不包括,linux期末考试练习题
- Java局域网对战游戏、天气预报项目
- python字符串操作总结_Python字符串的一些操作方法总结
- HDOJ--1203--I NEED A OFFER!
- CloudStack 4.4学习总结之注册ISO
- GoLang 插件化开发
- 肯耐珂萨java_站在尤里奇的肩膀上,肯耐珂萨探讨适用于国内的HR胜任力模型
- 利用WebSphere Edge Server构建冷轧系统负载均衡
- 在墨刀中使用思维导图
- cearte-react-app中craco中优雅引入svg【自定义宽、高、颜色,仅需5步】
- 机器学习:导数与偏导数的区别.
- CodeForces - 616C The Labyrinth dfs+暴力
- 新手C语言开发详细教程
- 兰伯特(Lambert)方程的求解算法3
- html js 在线预览 pdf word xls等
- 关于operator bool () 和bool operator ==()
- 微信朋友圈数据库模式如何设计的?
热门文章
- access2013数据库实验笔记_医学科研实验基础知识笔记(十):甲基化
- 多线程共用全局变量可能存在的威胁
- 【自动驾驶】3. DDS 数据分发服务(Data Distribution Service)
- windows下安装python+eclipse
- Java 面试知识点解析(三)——JVM篇
- MySql 里的IFNULL、NULLIF和ISNULL用法
- spring里头各种获取ApplicationContext的方法
- elasticsearch插件大全(不断更新)
- 鸟哥的Linux私房菜(服务器)- 簡易 Cluster 架設
- boost源码剖析之:Tuple Types(rev#2)