19.5 Boost Asio 传输结构体

举报
lyshark 发表于 2023/11/10 12:54:27 2023/11/10
887 0 0
【摘要】 同步模式下的结构体传输与原生套接字实现方式完全一致,读者需要注意的是在接收参数是应该使用socket.read_some函数读取,发送参数则使用socket.write_some函数实现,对于套接字的解析同样使用强制指针转换的方法。服务端代码如下所示#include <iostream>#include <boost/asio.hpp>typedef struct{ int uuid; ...

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

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

image.png

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。