转载:http://blog.csdn.net/educast/article/details/13167847

网络服务器通常要应对一些意外情况,如空连接行为,指在遇到客户端连接后不进行任何操作,并很可能在大量空连接情况下导致服务器资源耗尽而无法工作。

以下代码主要工作在连接后首次接收客户端消息的环节添加一个timer,并在指定时间后检测是否已接收到消息(验证消息环节此处略去),如果没有收到消息则可认为这是一个非正常连接,并马上断开。timer使用boost::asio::deadline_timer,相对比较简单,详情如下:

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time_types.hpp>
#include <boost/shared_ptr.hpp>
#include <iostream>using namespace boost::asio;
using boost::asio::ip::tcp;class Session : public boost::enable_shared_from_this<Session>
{
public:Session(boost::asio::io_service& io_service):timer_(io_service),socket_(io_service),is_read_(false){Start();}void Start(){socket_.async_read_some(boost::asio::buffer(buff,1024),bind(&Session::HandleRead,shared_from_this(),boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));//当客户端连接上5秒钟以后检测是否进行了通信
        timer_.expires_from_now(boost::posix_time::seconds(5));timer_.async_wait(boost::bind(&Session::time_out, shared_from_this()));}void HandleRead(const boost::system::error_code& error, size_t len){if (!error){is_read_ = true;cout << buff << endl;socket_.async_read_some(boost::asio::buffer(buff,1024),bind(&Session::HandleRead,shared_from_this(),boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));}}
private:void time_out(){//判断没有从客户端读取到消息的情况下断开连接
        if(!is_read_) socket_.close();}private:deadline_timer timer_;tcp::socket socket_;char buff[1024];bool is_read_;
};

boost.asio防止恶意空连接的方法相关推荐

  1. Boost asio 官方教程简介

    1. 概述 本章介绍了 Boost C++ 库 Asio,它是异步输入输出的核心. 名字本身就说明了一切:Asio 意即异步输入/输出. 该库可以让 C++ 异步地处理数据,且平台独立. 异步数据处理 ...

  2. boost::asio译文

    boost::asio译文 Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布( ...

  3. Boost.Asio技术文档汇总

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  4. boost::asio中文文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  5. Boost.Asio技术文档

    文章来源:http://blog.csdn.net/henreash/article/details/7469707 Boost.Asio是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手 ...

  6. Boost.Asio 技术文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  7. Boost asio 定时器

    Boost asio入门学习笔记 版权声明:本文为博主原创文章,未经博主允许不得转载.文章中有连接失效或是技术谬误的地方,请与我联系. https://blog.csdn.net/luchengtao ...

  8. linux串口boost,Boost串口通信第一课 boost::asio::serial_port基本使用

    boost库有一个asio,支持串口通信. 步骤: 1.产生一个boost::asio::io_service(前摄模式,类似于完成端口,不过,可以针对不同IO对象) 2.构造一个boost::asi ...

  9. Boost串口通信 boost::asio::serial_port基本使用

    Boost串口通信 boost::asio::serial_port基本使用 boost库有一个asio,支持串口通信. 步骤: 1.产生一个boost::asio::io_service(前摄模式, ...

最新文章

  1. vim - ctags
  2. POST请求||带参数的POST请求
  3. WebFlux基础之响应式编程
  4. linux内核层是什么,从用户层到内核层 - Linux内核中的信号机制_Linux编程_Linux公社-Linux系统门户网站...
  5. python的核心数据类型_Python核心数据类型-集合
  6. Linux环境进程间通信 信号量
  7. 大学python怎么过_大学生该不该学Python?太纠结了?
  8. 科学家的假想-substr的妙用
  9. 专用工业接口电缆行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  10. 制造-销售”模式正在消亡,传统大型企业的上云之路要如何举步?
  11. Ubuntu 安装hadoop 伪分布式
  12. 自己使用过比较好用的VSCode插件
  13. 单变量微分、导数与链式法则
  14. java中double类型占几个字节_Java中的单双精度数据类型分别占几个字节?
  15. matlab画空间直线,空间直线x y=z怎么画
  16. 泰坦尼克号python数据分析统计服_Kaggle入门级赛题:泰坦尼克号生还者预测——数据分析篇...
  17. 标准盒模型与怪异盒模型
  18. Mac Redis开机自启动
  19. SpringApplicationRunListener
  20. 网络工程师知识点整理—第五章:无线通信网

热门文章

  1. Zabbix2.2.6邮件报警设置方法
  2. iOS自动布局进阶用法
  3. .读取excel表格(JAVA)
  4. linux下安装oracle 11g R2
  5. 同步本地远程分支 git remote prune origin
  6. Android应用开发—RecyclerView绘制蒙层
  7. mysql event 简单demo
  8. 有关javabean的说法不正确的是_关于 JavaBean, 下列叙述中不正确的是 ( ) 。_学小易找答案...
  9. Java笔记03-Constructor Override
  10. nginx+uwsgi部署Django