boost::asio一个简单的echo服务器

本文介绍如何使用Boost.Asio库在Linux环境下构建一个异步TCPEcho服务器,涵盖非阻塞I/O、线程池实现及异步回调机制等内容。

以前使用ACE实现Server框架,但是觉得太笨重,决定采用boost.asio来写服务器程序:

1.服务器构建在linux上面;当然也可以在windows下运行
2.io
部分采用非阻塞模式、业务逻辑部分采用同步线程池实现
3.
封装io操作及状态,用户应用程序无需关心io详细操作

所以决定采用boost::asio框架来写服务器:

boost::asio::io_service提供了核心IO功能、和异步IO对象,它包括:
boost::asio::ip::tcp::socket
boost::asio::ip::tcp::acceptor
boost::asio::ip::udp::socket
boost::asio::deadline_timer
io_service
支持线程安全、共享对象安全;调用run()函数未完成时会引发reset();

boost.asio异步方式的函数前面都加有async_前缀,函数参数中会要求放入一个回调函数(或仿函数);异步操作执行完后无论有没有完成都会立即返回,这时候可以处理其他事情,等到回调函数被调用就说明异步操作已经完毕。
boost.asio
的很多回调函数值接收boost::system::error_code参数,在实际使用中是不够的,所以一般的仿函数都会携带一堆数据作为回调,或使用boost::bind来绑定一堆数据。
只有boost.asio.run()运行后回调对象才会被调用,否则即使系统已经完成了异步操作也不会有任何动作!


//下面是一个异步模式的简单的Tcp echo服务器
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/smart_ptr.hpp>

using namespace boost::asio;
using boost::system::error_code;
using ip::tcp;

struct CHelloWorld_Service
{
//类的初始化创建:设置io_service, 设置1000端口
CHelloWorld_Service(io_service &iosev)
:m_iosev(iosev),m_acceptor(iosev, tcp::endpoint(tcp::v4(), 1000))
{
}

//创建一个tcpsocket;且还是侦听
void start()
{
// 开始等待连接(非阻塞)
boost::shared_ptr<tcp::
socket> psocket(new tcp::socket(m_iosev));

// 触发的事件只有error_code参数,所以用boost::bindsocket绑定进去
m_acceptor.async_accept(*psocket, boost::
bind(&CHelloWorld_Service::accept_handler, this, psocket, _1) );
}

// 有客户端连接时accept_handler触发
void accept_handler(boost::shared_ptr<tcp::socket> psocket, error_code ec)
{
if(ec) return;

// 继续等待连接
start();

// 显示远程IP
std::cout << psocket->remote_endpoint().address() << std::endl;

// 发送信息(非阻塞)
boost::shared_ptr<
std::string> pstr(new std::string("hello async world!"));
psocket->async_write_some(buffer(*pstr),
boost::
bind(&CHelloWorld_Service::write_handler, this, pstr, _1, _2)
);
}

// 异步写操作完成后write_handler触发
void write_handler(boost::shared_ptr<std::string> pstr, error_code ec, size_t bytes_transferred)
{
if(ec)
std::cout<< "发送失败!" << std::endl;
else
std::cout<< *pstr << " 已发送" << std::endl;
}

private:
io_service &m_iosev;
ip::tcp::acceptor m_acceptor;
};


int main(int argc, char* argv[])
{
//建立io服务器
io_service iosev;

CHelloWorld_Service sev(iosev);

//开始侦听socket的连接;和开始接收远程数据
sev.start();

//开始执行回调函数
iosev.run();

return 0;
}

 

例子分析:
1.
调用sev.start()开始接受客户端连接。async_accept()其实就是注册了一个回调函数;所以它会立即返回。
2.iosev.run()
方法是一个循环,负责分发异步回调函数,只有当所有的异步操作执行完后才会返回。
3.
为了保证start()中的m_accptor.async_accept操作所用的socket在整个异步操作期间都是有效的,而且以后所有的客户端连接进来后该socket都是有效地,这里的解决办法是使用一个带计数的智能指针,shared_ptr,并将该指针绑定到回调函数上。该智能指针的生存周期等同于sev的生存周期。
4.
一旦有客户端连接,回调函数accept_handler()就会执行,在该函数中首先调用start()继续异步等待其他客户端连接;然后使用start()绑定进来的socket进行接收远程客户端的连接
5.
例子程序中发送数据也使用了异步模式async_write_some,同样需要保证整个异步发送期间缓冲区的有效性,所以使用了shared_ptr<string>参数
6.
对于客户端connect, read_some前面也可加入async_前缀,按照异步方式执行;

【完美复现】面向配电网韧性提升的移动储能预布局与动态调度策略【IEEE33节点】(Matlab代码实现)内容概要:本文介绍了基于IEEE33节点的配电网韧性提升方法,重点研究了移动储能系统的预布局与动态调度策略。通过Matlab代码实现,提出了一种结合预配置和动态调度的两阶段优化模型,旨在应对电网故障或极端事件时快速恢复供电能力。文中采用了多种智能优化算法(如PSO、MPSO、TACPSO、SOA、GA等)进行对比分析,验证所提策略的有效性和优越性。研究不仅关注移动储能单元的初始部署位置,还深入探讨其在故障发生后的动态路径规划与电力支援过程,从而全面提升配电网的韧性水平。; 适合人群:具备电力系统基础知识和Matlab编程能力的研究生、科研人员及从事智能电网、能源系统优化等相关领域的工程技术人员。; 使用场景及目标:①用于科研复现,特别是IEEE顶刊或SCI一区论文中关于配电网韧性、应急电源调度的研究;②支撑电力系统在灾害或故障条件下的恢复力优化设计,提升实际电网应对突发事件的能力;③为移动储能系统在智能配电网中的应用提供理论依据和技术支持。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析,重点关注目标函数建模、约束条件设置以及智能算法的实现细节。同时推荐参考文中提及的MPS预配置与动态调度上下两部分,系统掌握完整的技术路线,并可通过替换不同算法或测试系统进一步拓展研究。
先看效果: https://pan.quark.cn/s/3756295eddc9 在C#软件开发过程中,DateTimePicker组件被视为一种常见且关键的构成部分,它为用户提供了图形化的途径来选取日期与时间。 此类控件多应用于需要用户输入日期或时间数据的场景,例如日程管理、订单管理或时间记录等情境。 针对这一主题,我们将细致研究DateTimePicker的操作方法、具备的功能以及相关的C#编程理念。 DateTimePicker控件是由.NET Framework所支持的一种界面组件,适用于在Windows Forms应用程序中部署。 在构建阶段,程序员能够通过调整属性来设定其视觉形态及运作模式,诸如设定日期的显示格式、是否展现时间选项、预设的初始值等。 在执行阶段,用户能够通过点击日历图标的下拉列表来选定日期,或是在文本区域直接键入日期信息,随后按下Tab键或回车键以确认所选定的内容。 在C#语言中,DateTime结构是处理日期与时间数据的核心,而DateTimePicker控件的值则表现为DateTime类型的实例。 用户能够借助`Value`属性来读取或设定用户所选择的日期与时间。 例如,以下代码片段展示了如何为DateTimePicker设定初始的日期值:```csharpDateTimePicker dateTimePicker = new DateTimePicker();dateTimePicker.Value = DateTime.Now;```再者,DateTimePicker控件还内置了事件响应机制,比如`ValueChanged`事件,当用户修改日期或时间时会自动激活。 开发者可以注册该事件以执行特定的功能,例如进行输入验证或更新关联的数据:``...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值