You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用boost::asio::async_write向Netcat终端写入整数?

TCP返回整数时Netcat显示乱码问题

现象

收到Coop25消息后,向Netcat(TCP)终端返回整数,终端未显示预期数字,反而出现乱码:

NETCAT终端:
Coop25
����

尝试的代码

最初实现的整数写入函数:

void tcp::tcp_session::do_write()
{ 
    std::array<int, 1> test{1};
    auto self(shared_from_this());
    boost::asio::async_write(socket_, boost::asio::mutable_buffer(test.data(), test.size),
        [this, self](boost::system::error_code ec, std::size_t /*length*/)
        {
          if (!ec)
          {
            do_read();
          }
        });
}

改用字符串写入时一切正常:

std::string ret_mess_check{"blabla"};
const char* mess_to_reply = ret_mess_check.c_str();
do_write(mess_to_reply, strlen(mess_to_reply)); 

void tcp::tcp_session::do_write(const char* reply, std::size_t length)
{ 
    auto self(shared_from_this());
    boost::asio::async_write(socket_, boost::asio::buffer(reply, length),
        [this, self](boost::system::error_code ec, std::size_t /*length*/)
        {
          if (!ec)
          {
            do_read();
          }
        });
}

修改后的尝试

采纳建议后调整代码:

  • 在.hpp中声明成员变量:
boost::array<int, max_length> num_status_{-1};
  • 在.cpp中定义写入函数:
void dac_sim::tcp::tcp_session::do_write()
{ 
    auto self(shared_from_this());
    boost::asio::async_write(socket_, boost::asio::buffer(num_status_),
        [this, self](boost::system::error_code ec, std::size_t /*length*/)
        {
          if (!ec)
          {
            do_read();
          }
        });
}

但使用int类型时终端仍显示乱码,改为string则正常。


问题分析与解决方法

核心原因

你直接发送了整数的二进制原始数据,但Netcat是文本终端工具,只会按ASCII/UTF-8编码解析接收到的字节。

比如int类型的-1,在32位系统中二进制表示为0xFFFFFFFF,这4个字节对应的ASCII字符都是不可打印的控制字符,所以Netcat显示为乱码����;而发送字符串时,传递的是文本的编码字节,Netcat能正确解析为可读内容。

解决方法

  1. 将整数转换为字符串后发送(最适合Netcat场景):
    把要返回的整数转换成字符串形式,再用已验证可行的字符串写入逻辑发送。示例代码:
// 假设要发送num_status_的第一个元素
std::string num_str = std::to_string(num_status_[0]);
do_write(num_str.c_str(), num_str.size());
  1. 若需传递二进制整数(仅适用于自定义接收端):
    如果接收端是你自己编写的程序,可以约定二进制格式(比如字节序)后发送整数的原始数据,但Netcat这类文本工具无法直接解析二进制整数为可读数字。

内容的提问来源于stack exchange,提问作者rere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:37:01