boost asio 网络编程案例简单改写
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();
}
boost asio 网络编程案例简单改写的更多相关文章
- boost Asio网络编程简介
:first-child { margin-top: 0px; } .markdown-preview:not([data-use-github-style]) h1, .markdown-previ ...
- Boost.Asio 网络编程([译]Boost.Asio基本原理)
转自:https://m.w3cschool.cn/nlzbw/nlzbw-3vs825ya.html Boost.Asio基本原理 这一章涵盖了使用Boost.Asio时必须知道的一些事情.我们也将 ...
- Java 学习之网络编程案例
网络编程案例 一,概念 1,网络编程不等于网站编程 2,编程只和传输层打交道,即TCP和UDP两个协议 二,案例 1,TCP实现点对点的聊天 Server端:两个输入流:读客户端和控制台,一个输出端: ...
- boost asio 学习(九) boost::asio 网络封装
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=10 9. A ...
- boost::asio网络传输错误码的一些实验结果(recv error_code)
错误码很重要,可以由此判断网络连接到底发生了神马事情,从而驱动高层逻辑的行为.只有笼统的错误码判断的网络层是不够规范的,鄙人觉得有些错误码还是需要在网络层就区分开的,特此记录一些当前实验的错误码以及发 ...
- Java网络编程案例---聊天室
网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中JavaSE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接口,来专注于解决 ...
- Python网络编程-Socket简单通信(及python实现远程文件发送)
学习python中使用python进行网络编程,编写简单的客户端和服务器端进行通信,大部分内容来源于网络教程,这里进行总结供以后查阅. 先介绍下TCP的三次握手: 1,简单的发送消息: 服务器端: i ...
- Java网络编程以及简单的聊天程序
网络编程技术是互联网技术中的主流编程技术之一,懂的一些基本的操作是非常必要的.这章主要讲解网络编程,UDP和Socket编程,以及使用Socket做一个简单的聊天软件. 全部代码下载:链接 1.网络编 ...
- Linux网络编程案例分析
本代码来自于博主:辉夜星辰 本篇主要对运行代码中出现的问题进行分析,代码本身的内容后续展开讨论. 服务器端代码 /* Linux网络编程之TCP编程,服务器端读数据 socket函数之后,返回值ser ...
- Python学习笔记(二)网络编程的简单示例
Python中的网络编程比C语言中要简洁很多,毕竟封装了大量的细节. 所以这里不再介绍网络编程的基本知识.而且我认为,从Python学习网络编程不是一个明智的选择. 简单的TCP连接 服务器代码如 ...
随机推荐
- Spring异步Async和事务Transactional注解
Spring开发中我们我们常常用到@Transaction和@Async,但这2个注解加在一起很多的开发者不敢用,担心事务不生效.下面我们就仔细讲解一下这2个注解同时运用,文章用3个场景讲述它们之间的 ...
- Node.js学习笔记-----day05 (使用MongonDB重写学生信息管理案例)
认真学习,认真记录,每天都要有进步呀!!! 加油叭!!! 使用MongonDB重写学生信息管理案例 1. 显示首页 先在crud-demo目录下安装mongoose 改写student.js var ...
- 三天吃透Spring面试八股文(最新整理)
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...
- Docker全方位攻略与自动化运维
介绍 Docker Registry(Docker注册中心)是一个管理Docker容器镜像存储和交付的应用程序.注册中心集中容器镜像并减少开发人员的构建时间.Docker镜像通过虚拟化保证相同的运行环 ...
- JZOJ 2022.02.10【提高组】模拟总结
\(\text{简要题解}\) \(\text{GDOI2012}\) 的题 不得不说当年的题做起来真的很不爽 整体看起来就是数据结构+博弈论+宽搜+背包dp优化 考场上 \(T1\) 十分钟解决过了 ...
- JZOJ 4296. 有趣的有趣的家庭菜园
[NOIP2015模拟11.2]有趣的有趣的家庭菜园 题面 思路一 暴力 \(30\) 分! 很容易打,但是要注意: 开 \(\texttt{long long}\) 是非严格高于(等于是被允许的) ...
- MySQL数据类型补充
数据类型 整数数据类型 特殊说明: 对于整数类型,MySQL还支持在类型名称后面加小括号(M),而小括号中的M表示显示宽度,M的取值范围是(0, 255).int(M)这个M在字段的属性中指定了u ...
- Shell命令-常用操作
Shell基础 1 Shell命令的基本格式 基本格式 command [选项] [参数] []表示可选的,也就是可有可无.有些命令不写选项和参数也能执行,有些命令在必要的时候可以附带选项和参数. 短 ...
- Vulhub 漏洞学习之:Adobe ColdFusion
Vulhub 漏洞学习之:Adobe ColdFusion 目录 Vulhub 漏洞学习之:Adobe ColdFusion 1 Adobe ColdFusion 文件读取漏洞(CVE-2010-28 ...
- 打印出来的数据{ob: observer}、vue 中 [__ob__: Observer]问题
问题效果: 理想效果: 解决方案:JSON.parse(JSON.stringify( ob )) 首先我们要把这个数据获取原始数据 JSON.stringify([data]) 变成字符串 然后 ...