boost库asio详解8——几个TCP的简单例子
同步客户端
- 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库asio详解8——几个TCP的简单例子的更多相关文章
- boost库asio详解1——strand与io_service区别
namespace { // strand提供串行执行, 能够保证线程安全, 同时被post或dispatch的方法, 不会被并发的执行. // io_service不能保证线程安全 boost::a ...
- 【Boost】boost库asio详解5——resolver与endpoint使用说明
tcp::resolver一般和tcp::resolver::query结合用,通过query这个词顾名思义就知道它是用来查询socket的相应信息,一般而言我们关心socket的东东有address ...
- 【Boost】boost库asio详解3——io_service作为work pool
无论如何使用,都能感觉到使用boost.asio实现服务器,不仅是一件非常轻松的事,而且代码很漂亮,逻辑也相当清晰,这点上很不同于ACE.使用io_service作为处理工作的work pool,可以 ...
- 【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题
io_service::work类可以使io_service::run函数在没有任务的时候仍然不返回,直至work对象被销毁. void test_asio_nowork() { boost::asi ...
- Python爬虫之selenium库使用详解
Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...
- STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解)
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) 前面 ...
- 《TCP-IP详解卷3:TCP 事务协议、HTTP、NNTP和UNIX域协议》【PDF】下载
TCP-IP详解卷3:TCP 事务协议.HTTP.NNTP和UNIX域协议>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062539 ...
- Boost::bind使用详解
1.Boost::bind 在STL中,我们经常需要使用bind1st,bind2st函数绑定器和fun_ptr,mem_fun等函数适配器,这些函数绑定器和函数适配器使用起来比较麻烦,需要根据是全局 ...
- Boost::split用法详解
工程中使用boost库:(设定vs2010环境)在Library files加上 D:\boost\boost_1_46_0\bin\vc10\lib在Include files加上 D:\boost ...
随机推荐
- USB 3.0规范中译本 第8章 协议层
本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 协议层管理设备及其主机之间端到端的数据流.这一层建立在链路层提供对某些类型的包的保证传输(guarantee ...
- 跟我学AngularJs:Service、Factory、Provider依赖注入使用与差别
林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 本教程使用AngularJs版本号:1.5.3 AngularJ ...
- ### Hibernate中的事务与并发 ###
**事务相关的概念** 1. 什么是事务 * 事务就是逻辑上的一组操作,组成事务的各个执行单元,操作要么全都成功,要么全都失败. * 转账的例子:冠希给美美转钱,扣钱,加钱.两个操作组成了一个事情! ...
- 栈溢出笔记1.9 认识SEH
从本节開始,我们就要研究一些略微高级点的话题了,如同在1.2节中看到的,Windows中为抵抗栈溢出做了非常多保护性的检查工作,编译的程序默认开启了这些保护. 假设我们不能绕过这些保护.那么我们的Sh ...
- SetProcessWorkingSetSize() 方法使内存降低了很多(把内存放到交换区,其实会降低性能)——打开后长时间不使用软件,会有很长时间的加载过程,原来是这个!
在项目中对程序性能优化时,发现用SetProcessWorkingSetSize() 方法使内存降低了很多,于是查阅了相关的资料如下: 我的程序为什么能够将占用的内存移至虚拟内存呢? 其实,你也可以, ...
- js进阶 11-1 jquery中的页面内容操作的三个方法
jquery中的页面内容操作的三个方法 一.总结 一句话总结:记三个方法即可.text,html,val.因为这里是方法,所以设置值的是后面方法的参数. 1.jquery中的页面内容操作的三个方法? ...
- 【u239】整数分解
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 某些数能表示成为一些互不相同的整数的阶乘之和.如9=l!+2! +3!. 现在给定一个非负整数n,要求 ...
- ubuntu14.04下unix网络编程 环境的配置
在ubuntu下 首先:在unpv13e文件加下 ./configure cd lib make cd ../libfree make cd ../liggai make cd .. vim lib/ ...
- Myeclipse - Web项目转换技巧--处理Java项目、SVN非Web项目问题
喜欢从业的专注,七分学习的态度. 概述 对于Java调试,使用Eclipse习惯性的使用Junit调试,使用Myeclipse习惯性的将项目转成Web项目在Tomcat或Weblogic中调试,在My ...
- BZOJ 1855 股票交易 - 单调队列优化dp
传送门 题目分析: \(f[i][j]\)表示第i天,手中拥有j份股票的最优利润. 如果不买也不卖,那么\[f[i][j] = f[i-1][j]\] 如果买入,那么\[f[i][j] = max\{ ...