如何使用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能正确解析为可读内容。
解决方法
- 将整数转换为字符串后发送(最适合Netcat场景):
把要返回的整数转换成字符串形式,再用已验证可行的字符串写入逻辑发送。示例代码:
// 假设要发送num_status_的第一个元素 std::string num_str = std::to_string(num_status_[0]); do_write(num_str.c_str(), num_str.size());
- 若需传递二进制整数(仅适用于自定义接收端):
如果接收端是你自己编写的程序,可以约定二进制格式(比如字节序)后发送整数的原始数据,但Netcat这类文本工具无法直接解析二进制整数为可读数字。
内容的提问来源于stack exchange,提问作者rere
相关产品推荐
相关产品推荐

