使用 async_write 的 Boost 发送奇怪的数据

米科瓦伊·库钦斯基

我正在尝试使用 Boost 开发一个简单的聊天程序。我遇到了奇怪的情况。在运行发送简单文本的程序时,我使用 netcat 侦听特定端口。连接已建立,但文本混乱​​。实际上,我有时会得到一两个随机字符而不是整行。我把代码放在下面:

#include "lib/client.h"
#include <boost/asio.hpp>
#include <boost/asio/io_service.hpp>
#include <iostream>
#include <thread>
#include <string>


int main(int argc, char* argv[]){
    if(argc != 3){
        std::cout << "Wrong use. After specifying executable, add host and port\n";
        return 0;
    }
    boost::asio::io_service io_service;
    boost::asio::ip::tcp::resolver resolver(io_service);
    auto endpoint = resolver.resolve({argv[1],argv[2]});
    Client c(io_service, endpoint);
    std::thread t([&io_service](){ io_service.run();});
    std::string text = "Welcome host!";
    c.add_msg_to_deque(text);
    t.join();
    c.close();


    return 0;
}

这是客户端方法:

#include "../lib/client.h"
#include <boost/asio.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/array.hpp>
#include <deque>
#include <iostream>
#include <string>

void Client::connect(boost::asio::ip::tcp::resolver::iterator endpoint){
    boost::asio::async_connect(socket, endpoint,
        [this](boost::system::error_code ec, boost::asio::ip::tcp::resolver::iterator)
        {
          if (!ec)
          {
          }
        });
}

void Client::close()
{
    ios.post([this]() { socket.close(); });
}

void Client::add_msg_to_deque(const std::string& msg){
    ios.post([this,msg](){
         write_msg_deque.push_back(msg);
         send_msg();
     });
}

void Client::send_msg(){
    boost::array<char,128> buf;
    std::string temp_string = write_msg_deque.front();
    std::copy(temp_string.begin(),temp_string.end(),buf.begin());
    boost::asio::async_write(socket, boost::asio::buffer(buf,temp_string.size()),[this](boost::system::error_code ec, std::size_t){
        if(!ec){
            write_msg_deque.pop_front();
            if(!write_msg_deque.empty())
                send_msg();
        }
        else{
            socket.close();
        }
    });
}
rafix07

您正在使用async_write本地数据,这是个坏主意。async_write立即返回。调用async_write您的方法后send_msg终止,因此buf在发送消息之前销毁本地数据(数组)。您可以使用 IO 函数的同步版本来发送数据或buf作为类的成员保留以提供数据,直到数据成功发送。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用boost :: asio :: async_write时正在播放的TCP缓冲区?

来自分类Dev

使用boost的async_write的异步TCP服务器导致错误的文件描述符

来自分类Dev

我应该如何在boost :: asio的客户端应用程序中同时使用async_read_until和async_write?

来自分类Dev

boost :: asio :: async_write函数的用途是什么

来自分类Dev

boost :: asio :: async_write函数的用途是什么

来自分类Dev

Boost tcp_server async_write错误:访问冲突写入位置

来自分类Dev

boost :: asio :: async_write并缓冲超过65536字节

来自分类Dev

在async_read_until之后立即使用async_write的问题

来自分类Dev

使用tcp套接字执行async_write时,何时调用处理程序?

来自分类Dev

使用 Boost 的 JSON 数据

来自分类Dev

使用Asio(Boost)通过网络发送灵活的数据量

来自分类Dev

当断开连接时,boost :: asio :: async_write的WriteHandler无法正常工作(防火墙/手动断开网络连接)

来自分类Dev

在同一套接字上同时调用Boost C ++ ASIO函数close()和async_write()是否有问题?

来自分类Dev

使用boost.asio的免费async_ *函数时出现奇怪的错误

来自分类Dev

boost :: asio :: read阻止boost:asio :: write将数据发送到Java套接字

来自分类Dev

使用boost :: asio通过UDP发送结构

来自分类Dev

使用boost :: async_connect问题

来自分类Dev

使用Boost :: Spirit解析异构数据

来自分类Dev

asio :: async_write和链

来自分类Dev

asio :: async_write SEG FAULT

来自分类Dev

使用Boost向量和字符串的奇怪boost_program_options问题

来自分类Dev

使用boost :: asio发送HTTP GET请求,类似于cURL

来自分类Dev

如何使用boost :: asio :: ip :: tcp :: iostream发送POST?

来自分类Dev

Boost UDP 多播发送方未使用正确的端口

来自分类Dev

Boost :: asio async_write_some与async_send

来自分类Dev

如何丢弃通过boost :: asio发送的数据?

来自分类Dev

通过boost :: asio发送原始数据

来自分类Dev

如何丢弃通过boost :: asio发送的数据?

来自分类Dev

如何使用boost :: write_graphviz编写GraphViz子图

Related 相关文章

  1. 1

    使用boost :: asio :: async_write时正在播放的TCP缓冲区?

  2. 2

    使用boost的async_write的异步TCP服务器导致错误的文件描述符

  3. 3

    我应该如何在boost :: asio的客户端应用程序中同时使用async_read_until和async_write?

  4. 4

    boost :: asio :: async_write函数的用途是什么

  5. 5

    boost :: asio :: async_write函数的用途是什么

  6. 6

    Boost tcp_server async_write错误:访问冲突写入位置

  7. 7

    boost :: asio :: async_write并缓冲超过65536字节

  8. 8

    在async_read_until之后立即使用async_write的问题

  9. 9

    使用tcp套接字执行async_write时,何时调用处理程序?

  10. 10

    使用 Boost 的 JSON 数据

  11. 11

    使用Asio(Boost)通过网络发送灵活的数据量

  12. 12

    当断开连接时,boost :: asio :: async_write的WriteHandler无法正常工作(防火墙/手动断开网络连接)

  13. 13

    在同一套接字上同时调用Boost C ++ ASIO函数close()和async_write()是否有问题?

  14. 14

    使用boost.asio的免费async_ *函数时出现奇怪的错误

  15. 15

    boost :: asio :: read阻止boost:asio :: write将数据发送到Java套接字

  16. 16

    使用boost :: asio通过UDP发送结构

  17. 17

    使用boost :: async_connect问题

  18. 18

    使用Boost :: Spirit解析异构数据

  19. 19

    asio :: async_write和链

  20. 20

    asio :: async_write SEG FAULT

  21. 21

    使用Boost向量和字符串的奇怪boost_program_options问题

  22. 22

    使用boost :: asio发送HTTP GET请求,类似于cURL

  23. 23

    如何使用boost :: asio :: ip :: tcp :: iostream发送POST?

  24. 24

    Boost UDP 多播发送方未使用正确的端口

  25. 25

    Boost :: asio async_write_some与async_send

  26. 26

    如何丢弃通过boost :: asio发送的数据?

  27. 27

    通过boost :: asio发送原始数据

  28. 28

    如何丢弃通过boost :: asio发送的数据?

  29. 29

    如何使用boost :: write_graphviz编写GraphViz子图

热门标签

归档