【Boost】boost库asio详解8——TCP的简单例子1
同步客户端
- void test_asio_synclient()
- {
- typedef boost::asio::io_service IoService;
- // 该命名空间下有几个常用类: accetpt, resolver, endpoint, socket
- typedef boost::asio::ip::tcp TCP;
- try
- {
- IoService ios;
- boost::system::error_code error;
- // 1. 用解释器的方法, 常用来解析域名, 如
- // query("www.163.com","80"), 也可以 query("www.163.com","telnet")
- // echo 7/tcp
- // ftp 21/tcp # File Transfer Protocol (Control)
- // telnet 23/tcp # Virtual Terminal Protocol
- // smtp 25/tcp # Simple Mail Transfer Protocol
- // time 37/tcp timeserver # Time
- // TCP::resolver resolver(ios);
- // TCP::resolver::query query("127.0.0.1", "10000");
- // TCP::resolver::iterator endpoint_iterator = resolver.resolve(query);
- // TCP::resolver::iterator end;
- // TCP::socket socket(ios);
- // socket.connect(*endpoint_iterator, error);
- // 2. 用简便的方法
- TCP::socket socket(ios);
- TCP::endpoint endpoint(boost::asio::ip::address_v4::from_string("127.0.0.1"), 10000);
- socket.connect(endpoint, error);
- // 这里要判断一下, 否则没有连上会通过.
- if (error)
- throw boost::system::system_error(error);
- while(true)
- {
- // boost::array<char, 128> buf;
- std::vector<char> buf(128);
- size_t len = socket.read_some(boost::asio::buffer(buf), error);
- // 这是也要判断一下, 否则服务端运行断开, 这里会出现死循环.
- if (error == boost::asio::error::eof)
- break; // Connection closed cleanly by peer.
- else if (error)
- throw boost::system::system_error(error); // Some other error.
- // buf要注意控制大小。
- socket.write_some(boost::asio::buffer(buf, len), error);
- }
- }
- catch (std::exception& e)
- {
- PRINT_DEBUG(e.what());
- }
- }
同步服务端
- namespace
- {
- std::string make_daytime_string()
- {
- using namespace std; // For time_t, time and ctime;
- time_t now = time(0);
- return ctime(&now);
- }
- }
- void test_asio_synserver()
- {
- typedef boost::asio::io_service IoService;
- typedef boost::asio::ip::tcp TCP;
- try
- {
- IoService ios;
- /*
- *以下构造函数相当于以下步骤
- * basic_socket_acceptor<tcp> acceptor(io_service);
- * acceptor.open(tcp::v4());
- * acceptor.bind(tcp::endpoint(13));
- * acceptor.listen(0);//default
- */
- /*
- tcp::endpoint(端点)由以下三个部分组成
- 1. IP地址(address, address_v4, address_v6)
- 2. 端口号
- 3. 协议版本
- */
- TCP::acceptor acceptor(ios, TCP::endpoint(TCP::v4(), 13));
- for (;;)
- {
- TCP::socket socket(ios);
- acceptor.accept(socket);
- std::string message = make_daytime_string();
- boost::system::error_code ignored_error;
- boost::asio::write(socket,
- boost::asio::buffer(message),
- boost::asio::transfer_all(),
- ignored_error);
- PRINT_DEBUG(message);
- }
- }
- catch (std::exception& e)
- {
- std::cout << e.what() << std::endl;
- }
- }
异步服务端
- namespace
- {
- typedef boost::asio::io_service IoService;
- typedef boost::asio::ip::tcp TCP;
- std::string make_daytime_string()
- {
- using namespace std;
- time_t now = std::time(NULL);
- return ctime(&now);
- }
- class tcp_connection
- : public boost::enable_shared_from_this<tcp_connection>
- {
- public:
- typedef boost::shared_ptr<tcp_connection> pointer;
- static pointer create(IoService& io_service)
- {
- return pointer(new tcp_connection(io_service));
- }
- TCP::socket& socket()
- {
- return socket_;
- }
- void start()
- {
- message_ = make_daytime_string();
- boost::asio::async_write(
- socket_,
- boost::asio::buffer(message_),
- boost::bind(&tcp_connection::handle_write,
- shared_from_this(),
- boost::asio::placeholders::error,
- boost::asio::placeholders::bytes_transferred));
- }
- private:
- tcp_connection(IoService& io_service)
- : socket_(io_service)
- {
- }
- void handle_write(const boost::system::error_code& /*error*/,
- size_t /*bytes_transferred*/)
- {
- PRINT_DEBUG("write data!!!");
- }
- TCP::socket socket_;
- std::string message_;
- };
- class tcp_server
- {
- public:
- tcp_server(IoService& io_service)
- : acceptor_(io_service, TCP::endpoint(TCP::v4(), 10000))
- {
- start_accept();
- }
- private:
- void start_accept()
- {
- tcp_connection::pointer new_connection =
- tcp_connection::create(acceptor_.get_io_service());
- acceptor_.async_accept(
- new_connection->socket(),
- boost::bind(&tcp_server::handle_accept,
- this,
- new_connection,
- boost::asio::placeholders::error));
- }
- void handle_accept(tcp_connection::pointer new_connection,
- const boost::system::error_code& error)
- {
- if (!error)
- {
- new_connection->start();
- start_accept();
- }
- }
- TCP::acceptor acceptor_;
- };
- }
- // tcp_connection与tcp_server封装后
- void test_asio_asynserver()
- {
- try
- {
- IoService io_service;
- tcp_server server(io_service);
- // 只有io_service类的run()方法运行之后回调对象才会被调用
- io_service.run();
- }
- catch (std::exception& e)
- {
- std::cerr << e.what() << std::endl;
- }
- }
【Boost】boost库asio详解8——TCP的简单例子1相关推荐
- 【Boost】boost库asio详解9——TCP的简单例子2
客户端: // Client.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostream> #inclu ...
- 【Boost】boost库asio详解9——UDP的简单例子1
服务器: #include "stdafx.h" #include <iostream> #include <boost/asio.hpp> #includ ...
- 【Boost】boost库asio详解7——boost::asio::buffer用法
1. asio::buffer常用的构造方法 asio::buffer有多种的构造方法,而且buffer大小是自动管理的 1.1 字符数组 [cpp] view plain copy print? ...
- 【Boost】boost库asio详解3——io_service作为work pool
无论如何使用,都能感觉到使用boost.asio实现服务器,不仅是一件非常轻松的事,而且代码很漂亮,逻辑也相当清晰,这点上很不同于ACE. 使用io_service作为处理工作的work pool,可 ...
- 【Boost】boost库asio详解5——resolver与endpoint使用说明
tcp::resolver一般和tcp::resolver::query结合用,通过query这个词顾名思义就知道它是用来查询socket的相应信息,一般而言我们关心socket的东东有address ...
- 【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题
io_service::work类可以使io_service::run函数在没有任务的时候仍然不返回,直至work对象被销毁. [cpp] view plaincopy print? void tes ...
- 【Boost】boost库asio详解6——boost::asio::error的用法浅析
1. 概述 一般而言我们创建用于接收error的类型大多声明如下: [cpp] view plain copy print? boost::system::error_code error 我们用这 ...
- 【Boost】boost库asio详解4——deadline_timer使用说明
deadline_timer和socket一样,都用io_service作为构造函数的参数.也即,在其上进行异步操作,都将导致和io_service所包含的iocp相关联.这同样意味着在析构 io_s ...
- 【Boost】boost库asio详解2——strand与io_service区别
[cpp] view plain copy print? namespace { // strand提供串行执行, 能够保证线程安全, 同时被post或dispatch的方法, 不会被并发的执行. ...
最新文章
- java数据结构二叉树遍历_java数据结构 之 二叉树的遍历(1)
- easypoi 如何合并相同的列,如何在Java中的POI中使用XWPFTable合并单元格(或应用colspan)?...
- c语言输入若干数输出最小值循环结构,C语言上机150道题
- 阅读react-redux源码(三) - mapStateToPropsFactories、mapDispatchToPropsFactories和mergePropsFactories
- java继承序列化_java中序列化之子类继承父类序列化
- AD20元件重叠绿色报错的解决方法,距离太近绿色报错
- JavaScript中call,apply,bind方法
- 绝地求生最新服务器维护,绝地求生更新维护公告最新:3月10日吃鸡停机维护多久 几点开始?...
- 【教你方法】怎么批量手机号码查归属地,号码有好几百万千万甚至过亿,大量手机号归属地怎么查询?
- 用JAVA写一个小游戏程序难不难?具体步骤怎么操作?
- 三星手机GT-S7898连不上电脑,无法调试
- PHP微信固码免签系统源码+带监控APP和教程
- 笔试题————一套实用的渗透测试岗位面试题
- 哈希算法-SHA-256-过程详解
- 制作Linux登录欢迎界面
- 笔录 Flutter(二)Image的属性、使用、圆角、圆形
- 链路聚合,链路聚合是什么意思
- H264 nal_aud, TS格式分析;分析一帧数据包(H264)
- 不是学计算机的人工作后才开始学编程晚吗?能找到好工作吗?
- 山东省第七届ACM大学生程序设计竞赛 训练总结 [8/12] 待补
热门文章
- 类的加载连接和初始化
- 数据类型转换_自动转换
- flume高可用-failover-配置文件编写
- 解决JBoss只能通过localhost访问不能通过IP的问题
- PHP - windows下编译PHP 7.2的memcache
- 固定DIV不随滚动条滚动
- 深入浅出LVS:企业集群平台负载均衡的三种模式和算法实现
- 基于scrapy爬虫的天气数据采集(python)
- 2021HDU多校8 - 7059 Counting Stars(线段树)
- CodeForces - 1305C Kuroni and Impossible Calculation(鸽巢原理)