简介

这篇笔记主要记录了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结构笔记相关推荐

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

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

  2. boost asio io_service学习笔记

    转自:http://hi.baidu.com/jrckkyy/blog/item/e86835d61e60722506088b6a.html 构造函数 构造函数的主要动作就是调用CreateIoCom ...

  3. Boost asio学习笔记之二—— 网络编程

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

  4. boost.asio mysql_boost asio学习笔记

    1: 发现一个很诡异的问题: #include #include #include #include using namespace std; void print(const boost::syst ...

  5. Boost.Asio 笔记

    <Boost.Asio C++ Network Programming> libtorrent使用了Boost.Asio 支持 network com serial ports files ...

  6. Boost.Asio的网络编程

    简介 这篇笔记是boost::asio的概览, 主要说明了boost的进行CS结构编程的基本步骤. 在网络编程中, 又很多需要IO的操作. 一种是使用Linux的原生C语言API, Linux的核心编 ...

  7. Boost::asio概览

    Boost::asio核心的概念和功能 asio的最核心的功能是用于异步的IO通信, 比如通过文件 网络或者控制台等. asio提供了一系列的工具来处理这种长时间的IO操作, 而且执行这些操作不需要依 ...

  8. boost::asio中的C/S同步实例源码

    近来狂热地研究boost的开发技术,现将读书笔记整理如下: 需要说明的是, 本博该专题下面关于boost的源码是采用boost1.55版本, 运行在Ubuntu 14.04 64bit下面, 使用ap ...

  9. boost.asio包装类st_asio_wrapper开发教程(2014.5.23更新)(一)-----转

    一:什么是st_asio_wrapper 它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_ ...

最新文章

  1. 延长端粒续命有风险,科学家警告:端粒过长反而容易患癌
  2. legend3---3、lavarel页面post请求错误之后跳转
  3. 6.虚拟机类加载机制
  4. [Linux实用工具]munin-node插件配置和插件编写
  5. idea 设置项目子模块之间的依赖
  6. [NOTE]常用Linux命令总结[Thx for commandlinefu]
  7. 【线上分享】如何使用开源SFU构建RTC云服务
  8. 快速计算属于你的数字
  9. 招聘贴---这个很重要嘛
  10. Open3d之点云顶点法线估计
  11. linux -- open /acess/ftruncate/lstat 函数
  12. ECMAScript6 新特性——“数组的扩展”
  13. iOS:关于加载GIF图片的思考
  14. Javascript设计模式-18-状态模式
  15. 一个简单帆软报表制作基础步骤
  16. IOS之UIImageView--小实例项目--带音效的拳皇动画
  17. JavaWeb学习笔记(十三)之session的钝化和活化
  18. e.g., malformed request syntax, invalid request message framing, or deceptive request routing)
  19. IDEA 学生授权申请方式(免费)
  20. 微信小程序 图片左右滑动 swiper

热门文章

  1. redis key失效的事件_Redis常见、常用的知识点
  2. pytorch学习笔记(三十八):Image-Augmentation
  3. [转]/etc/passwd文件解析
  4. Chrome禁止http自动转为https
  5. 【QCustomPlot】1.0 - QCustomPlot库添加到自己的工程、创建工程
  6. c/c++入门教程 - 1.基础c/c++ - 1.0 Visual Studio 2019安装环境搭建
  7. mac上使用python 安装anaconda和pycharm
  8. 【网络】HTTPS 怎么保证数据传输的安全性
  9. 【Android】选项卡使用
  10. 以时间作为条件查询记录(案例)