首页 > 其他分享 >19.5 Boost Asio 传输结构体

19.5 Boost Asio 传输结构体

时间:2023-11-10 12:56:28浏览次数:38  
标签:Asio 19.5 code socket service buffer msg message Boost

同步模式下的结构体传输与原生套接字实现方式完全一致,读者需要注意的是在接收参数是应该使用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;
}

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

标签:Asio,19.5,code,socket,service,buffer,msg,message,Boost
From: https://www.cnblogs.com/LyShark/p/17823854.html

相关文章

  • 19.8 Boost Asio 异或加密传输
    异或加密是一种对称加密算法,通常用于加密二进制数据。异或操作的本质是对两个二进制数字进行比较,如果它们相同则返回0,如果不同则返回1。异或加密使用一把密钥将明文与密文进行异或运算,从而产生密文。同时,使用相同的密钥进行解密将返回原始的明文数据。在异或加密中,加密和解密使用......
  • Math.round(-2019.5)的结果是 -2019
    Math.round()函数返回一个数字四舍五入后最接近的整数如果参数的小数部分大于0.5,四舍五入到相邻的绝对值更大的整数如果参数的小数部分小于0.5,四舍五入到相邻的绝对值更小的整数如果参数的小数部分等于0.5,四舍五入到相邻的在正无穷(+∞)方向上的整数。例:x=Math.round(2019.49);......
  • 19.9 Boost Asio 同步字典传输
    这里所代指的字典是Python中的样子,本节内容我们将通过使用Boost中自带的Tokenizer分词器实现对特定字符串的切割功能,使用BoostTokenizer,可以通过构建一个分隔符或正则表达式的实例来初始化tokenizer。然后,可以使用该实例对输入字符串进行划分。tokenizer将在输入字符串中寻找匹配......
  • 19.12 Boost Asio 获取远程进程
    远程进程遍历功能实现原理与远程目录传输完全一致,唯一的区别在于远程进程枚举中使用EnumProcess函数枚举当前系统下所有活动进程,枚举结束后函数返回一个PROCESSENTRY32类型的容器,其中的每一个成员都是一个进程信息,只需要对该容器进行动态遍历即可得到所有的远程主机列表。服务端......
  • 19.13 Boost Asio 发送TCP流数据
    Boost框架中默认就提供了针对TCP流传输的支持,该功能可以用来进行基于文本协议的通信,也可以用来实现自定义的协议。一般tcp::iostream会阻塞当前线程,直到IO操作完成。首先来看服务端代码,如下所示在代码中首先通过GetFileSize读取文件行数,当有了行数我们就可以使用循环的方式依次调......
  • 19.13 Boost Asio 发送TCP流数据
    Boost框架中默认就提供了针对TCP流传输的支持,该功能可以用来进行基于文本协议的通信,也可以用来实现自定义的协议。一般tcp::iostream会阻塞当前线程,直到IO操作完成。首先来看服务端代码,如下所示在代码中首先通过GetFileSize读取文件行数,当有了行数我们就可以使用循环的方式依次调......
  • 19.13 Boost Asio 发送TCP流数据
    Boost框架中默认就提供了针对TCP流传输的支持,该功能可以用来进行基于文本协议的通信,也可以用来实现自定义的协议。一般tcp::iostream会阻塞当前线程,直到IO操作完成。首先来看服务端代码,如下所示在代码中首先通过GetFileSize读取文件行数,当有了行数我们就可以使用循环的方式依次调......
  • 19.6 Boost Asio 文本压缩传输
    Base64是一种二进制到文本的编码方案,用于将二进制数据转换为ASCII字符串格式。它通过将二进制数据流转换为一系列64个字符来工作,这些字符都可以安全地传输到设计用于处理文本数据的系统中。如下代码中我们使用Boost中提供的base64_from_binary头文件实现两个函数,其中Base64Decode......
  • 19.7 Boost Asio 传输序列化数据
    序列化和反序列化是指将数据结构或对象转换为一组字节,以便在需要时可以将其存储在磁盘上或通过网络传输,并且可以在需要时重新创建原始对象或数据结构。序列化是将内存中的对象转换为字节的过程。在序列化期间,对象的状态被编码为一组字节,并可以保存或传输到另一个位置。序列化后的......
  • Daleks' Invasion 题解
    Daleks'Invasion题目大意给定一张无向带权图,对于每条边求一个最大的\(x\),使得将这条边的边权修改为\(x\)后这条边能位于这张图的最小生成树上。思路分析没事干了就把之前写过的题拉出来水题解。我们先把原图的最小生成树求出来,考虑每条边\((u,v)\),分类讨论:如果这条边......