从 asio::async_write 接收到几个字符
Receiving to few chars from asio::async_write
我正在通过TCP/IP调用我的服务器。我正在发送几个字符并希望收到答案,即由我的acknowledge
-fct 发送。但是我只收到发送到服务器的字符数。
constexpr int maxInputBufferLength{1024};
using boost::asio::ip::tcp;
struct session
: public std::enable_shared_from_this<session>
{
public:
session(tcp::socket socket)
: socket_(std::move(socket))
{
}
void start(){
do_read();
}
private:
void do_read(){
auto self(shared_from_this());
socket_.async_read_some(boost::asio::buffer(data_, maxInputBufferLength),
[this, self](boost::system::error_code ec, std::size_t length)
{
command_t currentCommand{data_};
if(currentCommand.commandStringVector.front()==driveCommand){
acknowledge("driveCommand triggered by TCP");
}
....
}
void acknowledge(std::string ackmessage){
auto self(shared_from_this());
boost::asio::async_write(socket_, boost::asio::buffer(ackmessage, maxInputBufferLength),
[this, self, ackmessage](boost::system::error_code ec, std::size_t length)
{
std::cout << ackmessage <<"n";
if(ec.value()){
std::cerr << ec.category().name() << ':' << ec.value() << "n";
}
});
}
char data_[maxInputBufferLength];
};
根据我的小知识,我的acknowledge
函数使用自己的boost::asio::buffer
调用async_write
应该发送整个缓冲区,其中应该包含长度为maxInputBufferLength
的ackmessage
,这是一个全局constexpr int
。
你有未定义的行为,因为你将局部变量传递到buffer
中。 buffer
只是字符串的包装器,它可以被视为对:指向数据的指针和数据的大小,它不会复制ackmessage
。您需要确保ackmessage
存在,直到调用 async_write
的处理程序。 async_write
会立即返回,因此您现在拥有的内容如下所示:
acknowledge ()
{
ackmessage // local variable
async_write is called, it creates buffer to askmessage, pointer to string is stored
// async_write returns immediately
// ackmesssage is destroyed here
}
修复:
1( 考虑使用同步写入操作
2(如果你想保持异步,你可以ackmessage
存储为session
的数据成员,然后将其作为参数传递给buffer
。您需要找到某种方法来延长其生存期,直到调用处理程序。
这里有一个很好的示例来解决您的问题,从ackmessage
创建shared_ptr
并将其传递给您的处理程序 - lambda,它延长了正在写入的字符串的生存期。
相关文章:
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 将stl字符串缩小到小于15个字符的容量
- 带有多个字符分隔符的正则表达式
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- std::stoi 只转换前几个字符
- CIN 会丢失每行的前几个字符
- 字符串的串联正在替换前几个字符
- "std::isdigit"正在崩溃几个扩展的 ASCII 字符
- 从 asio::async_write 接收到几个字符
- 如何从标准::字符串中获取几个字符
- 给定一个字符串,如何检查前几个字符 == 另一个字符串?C++
- 如何截断前几个字符字符数组 C++
- 只选择字符串C++中的前几个字符
- 如何在c++中将几个bacis字符组合成一个字符串
- 我的字符数组只显示最后几个字符.c++
- 在c++中,如何从字符串中获取后面的几个字符?
- 从字符串末尾删除几个字符的更有效的方法
- 将几个不同的字符连接成一个字符串