19.5 Boost Asio 传输结构体

news2024/11/27 18:39:02

同步模式下的结构体传输与原生套接字实现方式完全一致,读者需要注意的是在接收参数是应该使用socket.read_some函数读取,发送参数则使用socket.write_some函数实现,对于套接字的解析同样使用强制指针转换的方法。

服务端代码如下所示

#include <iostream>
#include <boost/asio.hpp>

typedef struct
{
  int uuid;
  char uname[1024];
}message;

using namespace boost::asio;

int main(int argc, char* argv[])
{
  io_service io_service;
  ip::tcp::acceptor acceptor(io_service,ip::tcp::endpoint(ip::tcp::v4(), 1000));
  ip::tcp::socket socket(io_service);

  acceptor.accept(socket);

  boost::system::error_code error_code;

  // 定义接收结构
  char recv_buffer[sizeof(message) * 2] = { 0 };
  socket.read_some(boost::asio::buffer(recv_buffer, sizeof(message) * 2), error_code);
  
  // 强转为指针
  message *msg = (message *)recv_buffer;

  std::cout << "数组1: " << msg[0].uname << std::endl;
  std::cout << "数组2: " << msg[1].uname << std::endl;

  if (error_code)
  {
    std::cout << boost::system::system_error(error_code).what() << std::endl;
    return -1;
  }

  std::system("pause");
  return 0;
}

客户端代码如下所示

#include <iostream>
#include <boost/asio.hpp>

using namespace boost::asio;

typedef struct
{
  int uuid;
  char uname[1024];
}message;

message msg[2];

int main(int argc, char* argv[])
{
  io_service io_service;
  ip::tcp::socket socket(io_service);
  ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 1000);

  boost::system::error_code error_code;
  socket.connect(ep, error_code);

  // 定义发送变量
  char send_buffer[sizeof(message) * 2] = { 0 };

  // 将数据拷贝到结构中
  msg[0].uuid = 100;
  strcpy(msg[0].uname, "lyshark");

  msg[1].uuid = 200;
  strcpy(msg[1].uname, "admin");

  // 发送字节序
  memcpy(send_buffer, &msg, sizeof(message) * 2);
  socket.write_some(boost::asio::buffer(send_buffer, sizeof(message) *2 ));

  if (error_code)
  {
    std::cout << boost::system::system_error(error_code).what() << std::endl;
    return -1;
  }

  std::system("pause");
  return 0;
}

读者可自行编译并运行上述代码,则可实现对结构体的传输功能,输出效果如下图所示;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1192739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

班级新闻管理系统asp.net+sqlserver

班级新闻管理系统 附加功能 新闻图片&#xff0c;点击次数访问自增&#xff0c;每个人都只能增删改查自己发布的新闻&#xff0c;并可以看到所有人发布的新闻 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql serve…

在IDEA中使用maven项目总结

一 什么是mavenMaven本身也是Java写的,他是一款服务于Java平台的自动化构建工具Maven是一个项目管理工具,旨在简化软件项目的构建、依赖管理和项目信息管理。它使用基于项目对象模型(Project Object Model,POM)的概念来管理项目的构建和依赖,并提供了一套规范的项目结构…

flutter 使用 hive 遇到的错误

1. ] Unhandled Exception: RangeError: Not enough bytes available. 根据日志定位到 下图的地方 解决&#xff1a;因为之前存在保存到本地的信息&#xff0c;但是你修改了 数据类里面的东西&#xff08;比如添加变量啥的&#xff09;&#xff0c;清空app缓存或者卸载重新构…

使用微信小程序控制蓝牙小车(微信小程序端)

目录 使用接口界面效果界面设计界面逻辑设计 使用接口 微信小程序官方开发文档 接口说明wx.openBluetoothAdapter初始化蓝牙模块wx.closeBluetoothAdapter关闭蓝牙模块(调用该方法将断开所有已建立的连接并释放系统资源)wx.startBluetoothDevicesDiscovery开始搜寻附近的蓝牙…

处理uniapp打包后有广告的问题

1、登录平台&#xff08;开发者中心&#xff09; 2、 3、 4、 5、

Go defer简介

思考 开始之前&#xff0c;先考虑下下面的代码的执行结果&#xff1a; package mainimport "fmt"func test() int {i : 0defer func() {fmt.Println("defer1")}()defer func() {i 1fmt.Println("defer2")}()return i }func main() {fmt.Print…

筹码穿透率指标选股公式,衡量筹码抛压

在前面的文章中&#xff0c;介绍了博弈K线&#xff0c;它是根据筹码分布的原理结合普通K线的方法绘制出来的。当博弈K线的实体部分比较长的时候&#xff0c;说明当天穿越筹码密集区&#xff0c;有大量的筹码解套。通过引入换手率&#xff0c;可以衡量套牢盘的抛压程度。如果穿越…

酷安官网下载页前端自适应源码

酷安官网下载页前端自适应源码&#xff0c;自己拿走玩玩 站长只打开看了一眼&#xff0c;感觉风格还不错&#xff0c;纯html&#xff0c;自己魔改 转载自 https://www.qnziyw.cn/wysc/qdmb/24470.html

commons-io

概述 commons-io是apache开源基金组织提供的一组有关IO操作的类库&#xff0c;可以提高IO功能开发的效率。 commons-io工具包提供了很多有关io操作的类。有两个主要的类FileUtils, IOUtils。 FileUtils主要有如下方法: 使用commons-io简化io流读写 在项目中创建一个文件夹&…

Java系列之:字符串UTF-8 编码格式转换位 UTF-32 【生僻字截取问题】

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 前言 在项目开发中遇到这样一个需求&#x…

看农村供水信息化管理系统如何破解供水难题

你是否曾经想过&#xff0c;能够通过一款数字孪生系统平台&#xff0c;解决农村供水的难题&#xff1f;现在&#xff0c;我们带来了这样一款产品&#xff0c;它将为农村供水带来革命性的改变。 我们的农村供水信息化系统&#xff0c;是一款基于数字孪生技术的供水管理平台。它通…

卫星遥感·格物致知丨卫星遥感的力量——自然灾害监测的太空之眼—洪涝灾害监测

遥感卫星从太空感知地球和获取地球表面的信息&#xff0c;当前有上千颗遥感卫星每天不停的对地表成像&#xff0c;其数据广泛用于地球系统科学研究、资源环境管理、国土安全和自然灾害监测等领域。卫星遥感的优势有监测范围大、不受区域地形限制、重复观测和多种类型数据(感知多…

Unity Mirror学习(二) Command特性使用

Command&#xff08;命令&#xff09;特性 1&#xff0c;修饰方法的&#xff0c;当在客户端调用此方法&#xff0c;它将在服务端运行&#xff08;我的理解&#xff1a;客户端命令服务端做某事&#xff1b;或者说&#xff1a;客户端向服务端发消息&#xff0c;消息方法&#xff…

创新无处不在的便利体验——基于智能视频和语音技术的安防监控系统EasyCVR

随着科技的迅猛发展&#xff0c;基于智能视频和语音技术的EasyCVR智能安防监控系统正以惊人的速度改变我们的生活。EasyCVR通过结合先进的视频分析、人工智能和大数据技术&#xff0c;为用户提供了更加智能、便利的安全保护体验&#xff0c;大大提升了安全性和便利性。本文将介…

Geotrust的企业型通配符SSL证书申请

Geotrust作为世界知名的CA认证机构之一&#xff0c;颁发了各种SSL证书&#xff0c;其签发的数字证书被广泛应用于电子商务、企业间通信、网络安全等领域&#xff0c;SSL数字证书可以验证网络中用户的身份&#xff0c;确保数据的机密性和完整性。今天随SSL盾小编了解如何申请Geo…

OpenAI开发者大会大模型圈开卷AI Agent? 实在智能布局前瞻已下“先手棋”

“平地起惊雷&#xff0c;至今有余音。” 去年的11月&#xff0c;OpenAI发布ChatGPT给科技圈劈下了一道惊雷&#xff0c;引爆了全世界的AI大模型热潮&#xff0c;全球科技巨头公司争先恐后地推出通用大模型&#xff0c;探索产业应用的可能。 短短一年后&#xff0c;北京时间1…

ECharts中rich的使用

ECharts官方rich介绍 label: {// 在文本中&#xff0c;可以对部分文本采用 rich 中定义样式。// 这里需要在文本中使用标记符号&#xff1a;// {styleName|text content text content} 标记样式名。// 注意&#xff0c;换行仍是使用 \n。formatter: [{a|这段文本采用样式a},{b…

Vuex模块概念

一、核心概念 - module 1.目标 掌握核心概念 module 模块的创建 2.问题 由于使用单一状态树&#xff0c;应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时&#xff0c;store 对象就有可能变得相当臃肿。 这句话的意思是&#xff0c;如果把所有的状态都放在s…

别再跟我说你不理解 @Transactional 为什么会失效了!省流版解读

别再跟我说你不理解 Transactional 原理了&#xff01;省流版解读 前言user 表初始数据隔离级别&#xff1a;NESTED 案例一隔离级别&#xff1a;NESTED 案例一省流版答案解读隔离级别&#xff1a;NESTED 案例一省流版答案源码入口隔离级别 Propagation.NESTED 省流版源码剖析隔…