boost库中的网络编程的例子比较复杂,不太好理解,所以,从网上找了一个简单点的例子。网址如下:http://blog.chinaunix.net/u3/93184/showart_1846119.html.经过修改,可以运行。

服务器代码:


Servier.cpp

#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(data_,‘\0′,sizeof(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));

/*async_read跟客户端一样,还是不能进入handle_read函数,如果你能找到问题所在,请告诉我,谢谢*/

// --已经解决,boost::asio::async_read(...)读取的字节长度不能大于数据流的长度,否则就会进入

// ioservice.run()线程等待,read后面的就不执行了。
//boost::asio::async_read(m_socket,boost::asio::buffer(data_,max_len),

//         boost::bind(&clientSession::handle_read,shared_from_this(),

//         boost::asio::placeholders::error));

//max_len可以换成较小的数字,就会发现async_read_some可以连续接收未收完的数据

m_socket.async_read_some(boost::asio::buffer(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 << data_ << std::endl;
//boost::asio::async_read(m_socket,boost::asio::buffer(data_,max_len),

//     boost::bind(&clientSession::handle_read,shared_from_this(),

//     boost::asio::placeholders::error));

m_socket.async_read_some(boost::asio::buffer(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 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),
acceptor_(ioservice,endpoint)
{
session_ptr new_session(new clientSession(ioservice));
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();
//在这就应该看出为什么要封session类了吧,每一个session就是一个客户端

session_ptr new_session(new clientSession(m_ioservice));
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 acceptor_;
};

int main(int argc , char* argv[])
{
boost::asio::io_service myIoService;
short port = 8100/*argv[1]*/;
//我们用的是inet4

tcp::endpoint endPoint(tcp::v4(),port);
//终端(可以看作sockaddr_in)完成后,就要accept了

serverApp sa(myIoService,endPoint);
//数据收发逻辑

myIoService.run();
return 0;
}

客户端代码:

#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(getBuffer,‘\0′,1024);
}
~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));

/**读取服务端发下来的信息
*这里很奇怪,用async_read根本就不能进入handle_read函数
**/

// --已经解决,boost::asio::async_read(...)读取的字节长度不能大于数据流的长度,否则就会进入

// ioservice.run()线程等待,read后面的就不执行了。

//boost::asio::async_read(socket,
//     boost::asio::buffer(getBuffer,1024),
//     boost::bind(&client::handle_read,this,boost::asio::placeholders::error)
//    );
socket.async_read_some(boost::asio::buffer(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 << getBuffer << std::endl;
//boost::asio::async_read(socket,
//         boost::asio::buffer(getBuffer,1024),
//         boost::bind(&client::handle_read,this,boost::asio::placeholders::error)
//        );

//这样就可以实现循环读取了,相当于while(1)
//当然,到了这里,做过网络的朋友就应该相当熟悉了,一些逻辑就可以自行扩展了
//想做聊天室的朋友可以用多线程来实现
socket.async_read_some(
boost::asio::buffer(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 getBuffer[1024];
};

int main(int argc,char* argv[])
{
//if(argc != 3)
//{
// std::cerr << “Usage: chat_client <host> <port>\n”;
//    return 1;
//}

//我觉IO_SERVICE是一个基本性的接口,基本上通常用到的类实例都需要通过它来构造
//功能我们可以看似socket
boost::asio::io_service io_service;
//这个终端就是服务器
//它的定义就可以看作时sockaddr_in,我们用它来定义IP和PORT
tcp::endpoint endpoint(boost::asio::ip::address_v4::from_string("192.168.1.119"/*argv[1]*/),8100/*argv[2]*/);
//既然socket和sockaddr_in已经定义好了,那么,就可以CONNECT了
//之所以为了要把连接和数据处理封成一个类,就是为了方便管理数据,这点在服务端就会有明显的感觉了
boost::shared_ptr<client> client_ptr(new client(io_service,endpoint));
//执行收发数据的函数
io_service.run();
return 0;
}

修改192.168.1.119为127.0.0.1,然后先运行server,再运行client,一切ok.

转载于:https://www.cnblogs.com/lzjsky/archive/2011/04/15/2017198.html

Boost asio学习笔记之二—— 网络编程相关推荐

  1. Boost库学习笔记(二)算法模块-C++11标准

    Boost库学习笔记(二)算法模块-C++11标准 一.综述 Boost.Algorithm是一系列人通用推荐算法的集合,虽然有用的通用算法很多,但是为了保证质量和体积,并不会将太多通用算法通过审查测 ...

  2. Boost asio学习笔记之一—— 使用strand支持多线程调用service_io的方法

    asio是一个跨平台的网络库,可以作为boost的一部分,也可以使用独立的asio部分.这里记录学习的笔记,作为参考. 感觉asio的关键就是io_service对象.所有的异步同步都跟这个有关.多线 ...

  3. 学习笔记(19):Python网络编程并发编程-互斥锁

    立即学习:https://edu.csdn.net/course/play/24458/296430?utm_source=blogtoedu 1.互斥锁: 多进程间的内存是相互隔离的,因此其数据也是 ...

  4. 学习笔记(09):Python网络编程并发编程-模拟ssh远程执行命令-代码实现

    立即学习:https://edu.csdn.net/course/play/24458/296239?utm_source=blogtoedu 1.服务器端:接收客户端发送的命令,subprocess ...

  5. 学习笔记(04):Python网络编程并发编程-什么是socket

    立即学习:https://edu.csdn.net/course/play/24458/296233?utm_source=blogtoedu 1.什么是网络编程? 答:网络编程也叫做socket编程 ...

  6. 学习笔记-java基础-网络编程

    刚在培训机构学习完JAVA基础和WEB,感觉边学边忘.就把这作为记忆的笔记,我也不知道要不要记笔记,写在本子上太耗费时间了. 一.要想实现网络通信,首先要解决两个问题: ①:如何从网络中定位到一台或多 ...

  7. 学习笔记(06):Python网络编程并发编程-在简单套接字基础上加上通信循环

    立即学习:https://edu.csdn.net/course/play/24458/296235?utm_source=blogtoedu 1.服务器端 #以打电话通讯为例子进行说明 #导入相应的 ...

  8. 学习笔记(34):Python网络编程并发编程-异步调用与回调机制

    立即学习:https://edu.csdn.net/course/play/24458/296452?utm_source=blogtoedu 1.知识点:(详细见代码注释) 1)同步调用: res1 ...

  9. 学习笔记(33):Python网络编程并发编程-进程池线程池

    立即学习:https://edu.csdn.net/course/play/24458/296451?utm_source=blogtoedu 进程池与线程池: 一般应用在网站上,进程池或线程池最大的 ...

最新文章

  1. binutils工具集之---nm
  2. mysql锁表_MySQL中Alter table 你不知道的性能问题
  3. 解决:Error response from daemon: Get https://index.docker.io/v1/search?q=openjdkn=25: dial tcp: looku
  4. 处理mp3_如何把MP3转换成FLAC格式?这三个方法简单快速
  5. mac下安装node.js步骤
  6. ANSYS 有限元分析 命令流 实例
  7. YUV420之YV12格式以及yuv422格式的显示
  8. DTOI 10.25 测试 T3 雪人
  9. 如何通过低代码平台搭建以“督办”为中心的办公管理系统
  10. MVP前奏(二)MVC在Android的小短腿
  11. 锤子终究走起了小米的路子
  12. selectpicker 清空选项_boostrap selectpicker 用法
  13. PMEdit一个富文本框可以编辑文本、图片并可以显示GIF动画
  14. UCOSIII-任务管理(上)
  15. SWUST OJ 971: 统计利用先序遍历创建的二叉树的深度
  16. 专题 | Innovus 2020: 创新,永无止境
  17. java----缓存
  18. 圣劳伦斯散热器举行北交所IPO上市辅导签约仪式
  19. 社区计算机培训班总结,2019年社区计算机培训工作总结范文
  20. 新龙360计算机网络安全学校,学校与360网络安全学院及双元教育集团举行校企合作交流座谈会...

热门文章

  1. python处理excel案例_python操作excel例子
  2. 小米小爱蓝牙音箱_小米小爱蓝牙音箱——值否?
  3. TCP/IP学习笔记(四)TCP超时重传及拥塞控制
  4. 每天一道LeetCode-----重新实现next_permutation
  5. 每天一道LeetCode-----平面木桶最大容量,以较小的纵坐标为高,横坐标差为底
  6. sparksql(1)——Dataframe
  7. 二叉树中的最大路径和—leetcode124
  8. LCA 最近公共祖先(RMQ、树上倍增、Tarjan),树上两点距离,线段重合长度
  9. C++二维数组按行遍历和按列遍历的区别
  10. C++11强类型枚举,override/final