Boost Asio,聊天示例:如何在消息正文中手动写入? [chat_message.hpp]

Posted

技术标签:

【中文标题】Boost Asio,聊天示例:如何在消息正文中手动写入? [chat_message.hpp]【英文标题】:Boost Asio, chat example: How do I manually write in the body of the message? [chat_message.hpp] 【发布时间】:2016-05-14 15:24:18 【问题描述】:

我正在关注 Boost Asio 教程中的“chat example”。由于我对 Boost Asio 没有太多经验,我正在使用聊天示例实现我自己的客户端服务器应用程序,并根据我的需要对其进行修改。

现在我正在定义一个 Protocol.hpp 文件,其中包含网络协议的关键字。例如:

Protocol.hpp

#ifndef PROTOCOL_HPP
#define PROTOCOL_HPP

#include <iostream>

extern const char ACK;

#endif

Protocol.cpp

#include "Protocol.hpp"

const char ACK = "1";

如果您查看“chat_message.hpp”类,您会发现以下内容:

  const char* data() const
  
    return data_;
  

  char* data()
  
    return data_;
  

我尝试了以下方法:

std::sprintf(write_msgs_.data(), ACK, 2);

除了尝试像这样直接分配所需的代码——但我猜我正在获取const 函数——:

write_msgs_.data() = ACK;

我曾想过使用string 类,然后以某种方式将其转换为char,以便将其复制到write_msgs_.data() 中,甚至使用循环添加每个字符。我对 C++ 比较陌生,我似乎没有找到一个好的解决方案。 有什么合适的方法吗?

非常感谢您。

【问题讨论】:

【参考方案1】:

我找到了。我应该检查一下示例应用程序是如何做到的,它只是使用来自cstring 库的memcpy。因此,任何和我有同样问题的人都应该使用以下方法:

chat_client.cpp 文件的main

char line[chat_message::max_body_length + 1];
while (std::cin.getline(line, chat_message::max_body_length + 1))

  using namespace std; // For strlen and memcpy.
  chat_message msg;
  msg.body_length(strlen(line));
  memcpy(msg.body(), line, msg.body_length());
  msg.encode_header();
  c.write(msg);

如您所见,有一个 char line 变量将保存书面文本。之后,memcpy 用于将该行复制到邮件正文中。

【讨论】:

以上是关于Boost Asio,聊天示例:如何在消息正文中手动写入? [chat_message.hpp]的主要内容,如果未能解决你的问题,请参考以下文章

C++ 使用 Boost.asio 和 Beast 库在正文中发送数据

boost asio 网络聊天 代码修改学习

Boost asio程序在多线程上崩溃

BOOST ASIO POST HTTP REQUEST-标头和正文

boost::asio::read 函数挂起

C++ Boost Asio 简单聊天教程