boost库之aiso通信

#include "stdafx.h"
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <iostream>
using boost::asio::ip::tcp;

#define max_len 1024

class clientSession
 :public boost::enable_shared_from_this<clientSession>
{
public:
 clientSession(boost::asio::io_service& ioservice):m_socket(ioservice)
 {
  memset(m_data, 0, sizeof(m_data));
 }
 ~clientSession()
 {}
 tcp::socket& socket()
 {
  return m_socket;
 }
 void start()
 {
  //发送远程消息
  boost::asio::async_write(m_socket,
   boost::asio::buffer("link successed!"),
   boost::bind(&clientSession::handle_write,shared_from_this(),
   boost::asio::placeholders::error));
  //获取远程消息
  m_socket.async_read_some(boost::asio::buffer(m_data,max_len),
   boost::bind(&clientSession::handle_read,shared_from_this(),
   boost::asio::placeholders::error));
 }
private:
 void handle_write(const boost::system::error_code& error)
 {
  if(error)
  {
   m_socket.close();
  }
 }
 void handle_read(const boost::system::error_code& error)
 {

  if(!error)
  {
   std::cout << m_data << std::endl;
   m_socket.async_read_some(boost::asio::buffer(m_data,max_len),
    boost::bind(&clientSession::handle_read,shared_from_this(),
    boost::asio::placeholders::error));
  }
  else
  {
   m_socket.close();
  }
 }

private:
 tcp::socket m_socket;
 char m_data[max_len];
};

class serverApp
{
 typedef boost::shared_ptr<clientSession> session_ptr;
public:
 serverApp(boost::asio::io_service& ioservice,tcp::endpoint& endpoint)
  :m_ioservice(ioservice), m_acceptor(ioservice,endpoint)
 {
  session_ptr new_session(new clientSession(ioservice));
  //创建监听,接收到链接后handle_accept
  m_acceptor.async_accept(new_session->socket(),
   boost::bind(&serverApp::handle_accept,this,boost::asio::placeholders::error,
   new_session));
 }
 ~serverApp()
 {
 }
private:
 void handle_accept(const boost::system::error_code& error,session_ptr& session)
 {
  if(!error)
  {
   std::cout << "get a new client!" << std::endl;
   //实现对每个客户端的消息处理
   session->start();

   //new新的会话,继续接收新的客户端
   session_ptr new_session(new clientSession(m_ioservice));
   m_acceptor.async_accept(new_session->socket(),
    boost::bind(&serverApp::handle_accept,this,boost::asio::placeholders::error,
    new_session));
  }
 }
private:
 boost::asio::io_service& m_ioservice;
 tcp::acceptor m_acceptor;
};

int main(int argc , char* argv[])
{
 boost::asio::io_service myIoService;
 short port = 8100;
 tcp::endpoint endPoint(tcp::v4(),port);
 serverApp server(myIoService,endPoint);
 myIoService.run();
 return 0;
}

客户端

#include "stdafx.h"
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
using boost::asio::ip::tcp;
class client
{
public:
 client(boost::asio::io_service& io_service,tcp::endpoint& endpoint)
  : socket(io_service)//这里就把socket实例化了
 {
  //连接服务端 connect
  socket.async_connect(endpoint,
   boost::bind(&client::handle_connect,this,boost::asio::placeholders::error)
   );
  memset(m_getBuffer, 0, sizeof(m_getBuffer));
 }
 ~client()
 {}
private:
 void handle_connect(const boost::system::error_code& error)
 {
  if(!error)
  {
   //发送信息
   boost::asio::async_write(socket,boost::asio::buffer("hello,server!"),
    boost::bind(&client::handle_write,this,boost::asio::placeholders::error));
   //获取远程消息
   socket.async_read_some(boost::asio::buffer(m_getBuffer,1024),
    boost::bind(&client::handle_read,this,boost::asio::placeholders::error)
    );
  }
  else
  {
   socket.close();
  }
 }
 void handle_read(const boost::system::error_code& error)
 {
  if(!error)
  {
   std::cout << m_getBuffer << std::endl;
   socket.async_read_some(
    boost::asio::buffer(m_getBuffer,1024),
    boost::bind(&client::handle_read,this,boost::asio::placeholders::error)
    );
  }
  else
  {
   socket.close();
  }
 }
 void handle_write(const boost::system::error_code& error)
 {
 }

private:
 tcp::socket socket;
 char m_getBuffer[1024];
};

int main(int argc,char* argv[])
{
 //IO_SERVICE功能我们可以看似socket
 boost::asio::io_service io_service;
 tcp::endpoint endpoint(boost::asio::ip::address_v4::from_string("192.168.100.58"),8100);
 boost::shared_ptr<client> client_ptr(new client(io_service,endpoint));
 //开始执行回调函数如:handle_connect
 io_service.run();
 return 0;
}
时间: 2024-09-30 07:27:35

boost库之aiso通信的相关文章

(十一)boost库之多线程间通信

(十一)boost库之多线程间通信 1.互斥锁 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性.每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象. #include <iostream> #include <boost/thread.hpp> using namespace std; int g_num = 0; boost::mutex mu; //定义互斥锁对象 int Func(int nC

windows下安装boost库

工作中现在会接触boost,所以我计划两个月之内努力熟悉一下boost.今天在自己win10系统上尝试安装了boost库,下面把遇到的问题总结一下: 1. 下好1.61版本库,在boost目录下运行bootstrap.bat 时发现dos闪退且目录下并没有多出bjam.exe和b2.exe,以管理员权限运行也是没结果. 后来索性重启了下电脑,果然解决问题. 2. 接下来就是编译,编译命令的话上网搜下就有了,关键出现了CL不识别的问题,这个问题也好解决.在自己的boost目录下 shift+右键,

(三)Boost库之字符串处理

(三)Boost库之字符串处理 字符串处理一直是c/c++的弱项,string_algo库很好的弥补了这一点. string_algo 库算法命名规则: 前缀i    : 有这个前缀表名算法的大小写不敏感,否则大小写敏感 后缀_copy:  有这个后缀表明算法不变动输入,返回处理结果的拷贝,否则算法原地处理 后缀_if  :  有这个后缀表明算法需要一个作为判断式的谓词函数对象,否则使用默认的判断准则 string_algo库提供的算法共分五大类,如下: [1]大小写转换: [2]判断式与分类:

在win7 + vs express for desktop中安装stlport和boost库

一.安装stlport stlport是将sgi的stl库平移到各个平台上.sgi的这个库的特点就是效率非常高.boost在这个库上面运行要比vs自带的stl库效率高.所以我们首选安装stlport. 下载stlport:http://sourceforge.net/projects/stlport/ 最新版本是5.2.1 放到C盘根目录下面,解压.进入"vs2012 x86 native tools command prompt".(注意:用cmd不行) 进入"C:\STL

VS2008下直接安装使用Boost库1.46.1版本号

Boost库是一个可移植.提供源码的C++库,作为标准库的后备,是C++标准化进程的发动机之中的一个. Boost库由C++标准委员会库工作组成员发起,当中有些内容有望成为下一代C++标准库内容.在C++社区中影响甚大,是不折不扣的“准”标准库. Boost因为其对跨平台的强调,对标准C++的强调,与编写平台无关.大部分boost库功能的使用仅仅需包含对应头文件就可以,少数(如正則表達式库,文件系统库等)须要链接库.但Boost中也有非常多是实验性质的东西,在实际的开发中有用须要慎重.boost

在VS2013下配置BOOST库

1.安装Boost库 (1).首先打开Boost的官网(http://www.boost.org/),找到下载位置,如下图中红框所示,此时最新的版本是1.64.0: (2).点击进入下载页面,选择你需要的文件下载,这里我选择windows下的zip文件: (3).下载好后,解压,得到文件目录如下图,找到其中的bootstrap.bat文件: (4).双击运行bootstrap.bat后,让其自动运行完成后,会发现当前文件夹中增加了几个文件,找到其中的bjam.exe,如下图所示 (5).双击运行

Qt编译和使用boost库(附5.51的Boost下载)good

配置gcc可以在cmd中使用 添加MinGW到环境变量 安装过Qt的都已经默认安装过MinGw的环境了,只需要找到配置一下环境变量就行 我的在D:\Qt5.5.1\Tools\mingw492_32\bin 然后将该路径添加到系统环境变量中 验证是否安装成功 打开cmd,输入一下的内容 gcc -v 如果显示了gcc的版本信息,那么MinGw添加成功,下面就可以在cmd中访问了. 编译boost库 boost库版本介绍 我这里使用的是boost1.56,其他的版本也是一样的 生成b2.exe和b

C++11和Boost库

C++11标准中引入了很多Boost库中的东西,对于所有人来说,完全可以使用C++11来替代之前使用的boost库. 但是还有一些事项需要我们注意. 发现了一篇好文,出处: https://meetingcpp.com/index.php/br/items/c11-and-boost.html Some parts of the Standard Library in C++11 are predated in boost. When playing around with C++11, you

boost库在工作(15)绑定器与函数对象之三

前面已经可以优美地解决两个参数的函数给算法for_each调用了,但是又会遇到这样的一种情况,当需要三个参数或者三个以上的参数给算法for_each调用呢?从STL里的绑定器bind1st,显然是不行了,因为它最多只支持两个参数,那还有什么办法呢?这时就需要使用boost库里强大的绑定器bind了.它不仅适用的情况比STL库里的多,还更加方便,更加人性化.下面就来看看怎么样绑定三个参数的类成员函数的例子,如下: [cpp] view plaincopy //调用类的成员函数,但参数两个以上. /