boost.asio系列——socket编程
asio的主要用途还是用于socket编程,本文就以一个tcp的daytimer服务为例简单的演示一下如何实现同步和异步的tcp socket编程。
客户端
客户端的代码如下:
#include <iostream>
#include <boost/array.hpp>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
int main(int argc, char* argv[])
{
try
{
boost::asio::io_service io_service;
tcp::endpoint end_point(boost::asio::ip::address::from_string("127.0.0.1"), 3200);
tcp::socketsocket(io_service);
socket.connect(end_point);
for (;;)
{
boost::array<char, 128> buf;
boost::system::error_code error;
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.
std::cout.write(buf.data(), len);
}
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
主要流程如下:
- 通过tcp::socket类定义一个tcp client对象socket
- 通过connect函数连接服务器,打开socket连接。
- 通过read_some函数来读数据
另外,还可以通过write_some来写数据,通过close来关闭socket连接(这里是通过释放socket对象隐式释放连接)。
服务器
服务器代码如下:
#include <ctime>
#include <iostream>
#include <string>
#include <boost/asio.hpp>
using namespace boost;
using boost::asio::ip::tcp;
int main()
{
try
{
asio::io_service io_service;
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 3200));
for (;;)
{
tcp::socket socket(io_service);
acceptor.accept(socket);
time_t now = time(0);
std::string message = ctime(&now);
system::error_code ignored_error;
socket.write_some(asio::buffer(message), ignored_error);
}
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
主要流程如下:
- 通过tcp::acceptor类创建一个tcp server对象,并绑定端口(也可以不在构造器中自动绑定,而通过bind函数手动绑定)
- 通过accept函数获取远端连接
- 通过远端连接的write_some函数将数据发往客户端
异步服务器
前面的服务器是同步版本,在大并发的场景下一般需要用到异步socket。服务器的异步版本如下:
#include <ctime>
#include <iostream>
#include <string>
#include <memory>
#include <functional>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
using namespace std;
void process_client(shared_ptr<tcp::socket> client)
{
time_t now = time(0);
shared_ptr<string> message(new string(ctime(&now)));
auto callback = [=](const boost::system::error_code& err ,size_t size)
{
if ((int)size == message->length())
cout << "write completed" << endl;
};
client->async_send(boost::asio::buffer(*message), callback);
}
typedef function<void (const boost::system::error_code&)> accept_callback;
void start_accept(tcp::acceptor& server)
{
shared_ptr<tcp::socket> client(new tcp::socket(server.get_io_service()));
accept_callback callback = [&server, client](const boost::system::error_code& error)
{
if (!error)
process_client(client);
start_accept(server);
};
server.async_accept(*client, callback);
}
int main()
{
try
{
boost::asio::io_service io_service;
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 3200));
start_accept(acceptor);
io_service.run();
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
这个异步版本的逻辑倒不是很复杂,基本上和.net中传统的异步socket相似,不过需要注意的是,由于c++中内存需要自己管理,而asio框架也没有提供任何管理机制,因此需要注意async_accept、async_send等函数的参数生命周期,切记不能在里面传入栈变量的引用。如果是堆变量,需要确保释放,本例中我是通过share_ptr来实现的自动释放。
更多的示例请参看asio官方文档。
转载于:https://www.cnblogs.com/TianFang/archive/2013/02/02/2890529.html
boost.asio系列——socket编程相关推荐
- boost::asio向socket中异步读写数据
内容代码参考自: Boost.Asio C++ Network Programming Cookbook 异步写入数据的核心是异步回调函数. 在此之前, 必须弄明白异步IO的基本概念和回调函数触发的时 ...
- Boost.Asio的网络编程
简介 这篇笔记是boost::asio的概览, 主要说明了boost的进行CS结构编程的基本步骤. 在网络编程中, 又很多需要IO的操作. 一种是使用Linux的原生C语言API, Linux的核心编 ...
- boost.asio系列——io_service
IO模型 io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象). asio::io_service i ...
- boost boost::asio::read socket.read_some 区别
boost boost::asio::read 尝试读一定数量的字节,直到读到为止,或者出错 socket.read_some 读一下socket,读到多少算多少 带async的类似 出处:http: ...
- boost::asio的C/S结构笔记
简介 这篇笔记主要记录了boost::asio的socket编程中知识点, 更多的是说明一些坑- 为了简化描述, 这里仅仅针对同步编程时进行描写, 异步编程同理类比即可. 这里仅仅是客户端向服务器发射 ...
- Boost asio学习笔记之二—— 网络编程
boost库中的网络编程的例子比较复杂,不太好理解,所以,从网上找了一个简单点的例子.网址如下:http://blog.chinaunix.net/u3/93184/showart_1846119.h ...
- boost::asio译文
boost::asio译文 Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布( ...
- Boost.Asio入门
原文地址:https://mmoaay.gitbooks.io/boost-asio-cpp-network-programming-chinese/content/Chapter1.html Boo ...
- Boost.Asio技术文档汇总
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...
最新文章
- Android发布项目到外部仓库
- Python 21 Flask(二)上下文管理详解
- 〖Java〗Eclispe安装和使用viplugin
- 【tensorflow】重置/清除计算图
- elasticsearch的update_by_query
- [设计模式] - 策略模式(Java篇)
- CSP2021提高组复赛解析
- 第七十期:IT技术人员的自我修养
- 【牛客 - 327G】处女座与复读机(可编辑距离问题,dp)
- SpringBoot系列之使用自定义注解校验用户是否登录
- 小米air2se耳机只有一边有声音怎么办_别光盯着AirPods,这些无线蓝牙耳机,其实也很好用...
- 【Vmware的vmdk文件转img文件】
- STM32使用外部中断控制led灯亮灭
- html+css 模仿制作百度注册页面
- gitlab镜像仓库设置及自动同步代码到服务器实现方式
- 赵铁安烧饼机器人_洛阳市民发明打烧饼机器人
- 2秒下一部4K电影 挥别蹭网下片时代
- Android商城开发----点击加入购物车,购物车商品的增删减
- 反应性叠氮化物N3-PEG-NH2,Azide-PEG-Amine,叠氮-聚二乙醇-胺
- matplotlib设置中英文多种字体混合坐标轴名称
热门文章
- c++面试题之标准模板库
- 计算机技术在职研究生学校,计算机技术在职研究生招生2020
- union和union all有什么区别_什么是Python Wheels?为什么要关心它?
- redis相比memcached有哪些优势?
- 032_SpringBoot多环境属性配置文件
- 001_Redis介绍
- 013_CSS兄弟选择器
- 008_logback配置语法
- 动圈耳机振膜_耳机中的动圈、动铁、圈铁都是什么意思 买哪种最好?
- 页面转发后文本显示???_使用Divi的滑动动画显示过程的进度