boost教程:http://zh.highscore.de/cpp/boost/
改写7.4网络编程案例,服务器支持连接多个客户端 服务端:
#include <iostream>
#include <string>
#include <boost/asio.hpp> /// <summary>
/// 简单服务器,客户端连接就发送 HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, world!
/// </summary> boost::asio::io_context io;
boost::asio::ip::tcp::socket sock(io);
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 9076);
boost::asio::ip::tcp::acceptor acceptor(io, endpoint);
std::string data = "HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, world!"; void accept_handler(const boost::system::error_code& ec)
{
if (!ec)
  {
//如果有新客户端连接,需要将sock转移给新的客户端sock,原来的sock用于继续接收新客户端
boost::asio::ip::tcp::socket client_sock(std::move(sock));
client_sock.async_write_some(boost::asio::buffer(data), [](const boost::system::error_code& ec, std::size_t size) {});
}
acceptor.async_accept(sock, accept_handler);
}
int main()
{
acceptor.listen();
acceptor.async_accept(sock,accept_handler); io.run();
}
客户端:
#include <boost/asio.hpp>
#include <boost/array.hpp>
#include <iostream>
#include <string> boost::asio::io_context io;
boost::asio::ip::tcp::socket sock(io);
boost::asio::ip::tcp::resolver resolver(io);
boost::array<char, 1024> buff; void read_handler(const boost::system::error_code& ec, std::size_t size)
{
//请留意,read_handler() 在将数据写出至 std::cout 之后,会再次调用 async_read_some() 方法。
//这是必需的,因为无法保证仅在一次异步操作中就可以接收到整个网页。 async_read_some() 和 read_handler()
//的交替调用只有当连接被破坏时才中止,如当 web 服务器已经传送完整个网页时。 这种情况下,在 read_handler() 内部将报告一个错误,
// 以防止进一步将数据输出至标准输出流,以及进一步对该 socket 调用 async_read() 方法。 这时该例程将停止,因为没有更多的异步操作了。
if (!ec)
{
std::cout << std::string(buff.data(), size) << std::endl;
//客户端接收一次消息接收完就结束进程
sock.async_read_some(boost::asio::buffer(buff), read_handler);
}
//客户端可以继续接收消息,不结束进程
//sock.async_read_some(boost::asio::buffer(buff), read_handler);
} void connect_handler(const boost::system::error_code& ec)
{
if (!ec)
{
sock.async_read_some(boost::asio::buffer(buff), read_handler);
}
} void resolver_handler(const boost::system::error_code& ec, boost::asio::ip::tcp::resolver::iterator it)
{
if (!ec)
{
sock.async_connect(*it, connect_handler);
}
}
int main()
{
boost::asio::ip::tcp::resolver::query query("127.0.0.1", "9076");
resolver.async_resolve(query, resolver_handler);
io.run();
}

最新文章

  1. Ubuntu 14.04 安装VMware 12
  2. 基础笔记6(exception)
  3. VBA_Excel_教程:过程,函数
  4. 【USACO】namenum
  5. linux rc.sysinit文件详解
  6. UITableView详解(1)
  7. 谈C#中的Delegate
  8. java-base64
  9. 搭建Struts2开发环境
  10. 用phpMyAdmin修改mysql数据库密码
  11. 关于BitmapFactory.decodeStream(is)方法无法正常解码为Bitmap对象的解决方法
  12. HDU 2040 亲和数
  13. htm的常见布局
  14. springMVC源码分析--@SessionAttribute用法及原理解析SessionAttributesHandler和SessionAttributeStore
  15. 字典fromkeys方法和update方法
  16. python的学习笔记01_4基础数据类型列表 元组 字典 集合 其他其他(for,enumerate,range)
  17. linxu上安装mongodb3.6实战
  18. js,jQuery获取html5的data-*属性
  19. Android查询不到电话号码解决方法
  20. css3---2D效果 ---3D效果

热门文章

  1. vue学习笔记(五)---- vue动画
  2. Mybatis Plus整合PageHelper分页的实现示例
  3. IDEA创建新的模块springboot
  4. JAVA虚拟机05-内存溢出示例(jdk1.8)
  5. JSON Crack 数据可视化工具
  6. MySQL 常用函数一览
  7. 安装KaLi操作系统并优化
  8. day15-SpringMVC执行流程
  9. LG P4213【模板】杜教筛(Sum)
  10. 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(8)-Charles如何进行断点调试