boost::asio的C/S结构笔记
简介
这篇笔记主要记录了boost::asio的socket编程中知识点, 更多的是说明一些坑… 为了简化描述, 这里仅仅针对同步编程时进行描写, 异步编程同理类比即可. 这里仅仅是客户端向服务器发射一条消息, 然后服务器在控制台显示.
客户端
客户端的步骤:
- 创建io_context
- 创建endpoint, 并初始化
- 创建socket, 并连接到指定的endpoint中, 两种连接方式的区别参考: https://stackoverflow.com/questions/15687016/difference-between-socket-connect-and-boostasioconnect
- 向socket写入数据, 有两个方式写入数据,
boost::asio::write
保证可以写完所有数据, 而socket::write_some
只能保证至少写入一个字节, 所以这里用第一个方式.
代码实例:
#include <iostream>
#include <boost/asio.hpp>
#include <string>std::string raw_ip_addr = "127.0.0.1";
unsigned short port_num = 6769;int main() {boost::asio::io_context ioc;boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string(raw_ip_addr), port_num);boost::asio::ip::tcp::socket sock(ioc, ep.protocol());sock.connect(ep);std::string msg("Hello world !\n");if (boost::asio::write(sock, boost::asio::buffer(msg)) < 0) {std::cerr << "boost::asio::write() error\n";return -1;}std::cout << "send successfully\n";return 0;
}
服务器
服务器步骤:
- 创建io_context
- 创建endpoint, 并初始化
- 创建
acceptor
, 作为一个连接器使用 acceptor
绑定到指定的endpoint- 接收socket的连接, 并接收数据
需要格外注意, 即使数据接收成功, 但是如果是没有多余的数据了, 会有eof的错误, 这是提醒数据接收完毕, 需要单独处理, 具体看代码.
代码实例:
#include <iostream>
#include <string>
#include <boost/asio.hpp>size_t SIZE = 1024;
unsigned short port_num = 6769;int main() {boost::asio::io_context ioc;boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address_v4::any(), port_num);boost::asio::ip::tcp::acceptor acceptor(ioc, ep.protocol());acceptor.bind(ep);acceptor.listen(5); // 最多排列5个boost::asio::ip::tcp::socket sock(ioc);acceptor.accept(sock);std::string msg;boost::system::error_code error;try {char cmsg[SIZE];SIZE = boost::asio::read(sock, boost::asio::buffer(cmsg, SIZE), error);msg += std::string(cmsg, SIZE);if (error != boost::asio::error::eof) { // 非eof错误, 需要抛出异常throw boost::system::system_error(error);}} catch (std::exception e) {std::cout << "recv error: " << e.what() << std::endl;sock.close();return -1;}sock.close();std::cout << "Message: " << msg << std::endl;return 0;
}
boost::asio的C/S结构笔记相关推荐
- Boost asio学习笔记之一—— 使用strand支持多线程调用service_io的方法
asio是一个跨平台的网络库,可以作为boost的一部分,也可以使用独立的asio部分.这里记录学习的笔记,作为参考. 感觉asio的关键就是io_service对象.所有的异步同步都跟这个有关.多线 ...
- boost asio io_service学习笔记
转自:http://hi.baidu.com/jrckkyy/blog/item/e86835d61e60722506088b6a.html 构造函数 构造函数的主要动作就是调用CreateIoCom ...
- Boost asio学习笔记之二—— 网络编程
boost库中的网络编程的例子比较复杂,不太好理解,所以,从网上找了一个简单点的例子.网址如下:http://blog.chinaunix.net/u3/93184/showart_1846119.h ...
- boost.asio mysql_boost asio学习笔记
1: 发现一个很诡异的问题: #include #include #include #include using namespace std; void print(const boost::syst ...
- Boost.Asio 笔记
<Boost.Asio C++ Network Programming> libtorrent使用了Boost.Asio 支持 network com serial ports files ...
- Boost.Asio的网络编程
简介 这篇笔记是boost::asio的概览, 主要说明了boost的进行CS结构编程的基本步骤. 在网络编程中, 又很多需要IO的操作. 一种是使用Linux的原生C语言API, Linux的核心编 ...
- Boost::asio概览
Boost::asio核心的概念和功能 asio的最核心的功能是用于异步的IO通信, 比如通过文件 网络或者控制台等. asio提供了一系列的工具来处理这种长时间的IO操作, 而且执行这些操作不需要依 ...
- boost::asio中的C/S同步实例源码
近来狂热地研究boost的开发技术,现将读书笔记整理如下: 需要说明的是, 本博该专题下面关于boost的源码是采用boost1.55版本, 运行在Ubuntu 14.04 64bit下面, 使用ap ...
- boost.asio包装类st_asio_wrapper开发教程(2014.5.23更新)(一)-----转
一:什么是st_asio_wrapper 它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_ ...
最新文章
- 延长端粒续命有风险,科学家警告:端粒过长反而容易患癌
- legend3---3、lavarel页面post请求错误之后跳转
- 6.虚拟机类加载机制
- [Linux实用工具]munin-node插件配置和插件编写
- idea 设置项目子模块之间的依赖
- [NOTE]常用Linux命令总结[Thx for commandlinefu]
- 【线上分享】如何使用开源SFU构建RTC云服务
- 快速计算属于你的数字
- 招聘贴---这个很重要嘛
- Open3d之点云顶点法线估计
- linux -- open /acess/ftruncate/lstat 函数
- ECMAScript6 新特性——“数组的扩展”
- iOS:关于加载GIF图片的思考
- Javascript设计模式-18-状态模式
- 一个简单帆软报表制作基础步骤
- IOS之UIImageView--小实例项目--带音效的拳皇动画
- JavaWeb学习笔记(十三)之session的钝化和活化
- e.g., malformed request syntax, invalid request message framing, or deceptive request routing)
- IDEA 学生授权申请方式(免费)
- 微信小程序 图片左右滑动 swiper
热门文章
- redis key失效的事件_Redis常见、常用的知识点
- pytorch学习笔记(三十八):Image-Augmentation
- [转]/etc/passwd文件解析
- Chrome禁止http自动转为https
- 【QCustomPlot】1.0 - QCustomPlot库添加到自己的工程、创建工程
- c/c++入门教程 - 1.基础c/c++ - 1.0 Visual Studio 2019安装环境搭建
- mac上使用python 安装anaconda和pycharm
- 【网络】HTTPS 怎么保证数据传输的安全性
- 【Android】选项卡使用
- 以时间作为条件查询记录(案例)