c++ - 如何将 boost::asio::ip::tcp::v4 打印到标准输出
问题描述
我正在运行 boost.asio 示例中的 c++11 聊天示例,并尝试打印 tcp::v4() 返回值以查看服务器正在使用的 IP 地址。没有 to_string 函数可以在 boost::asio::ip::tcp 上工作,就像在 boost::asio::ip 上一样。
以下是聊天示例的 server.cpp 中的主要功能:
int main(int argc, char* argv[])
{
try
{
if (argc < 2)
{
std::cerr << "Usage: chat_server <port> [<port> ...]\n";
return 1;
}
boost::asio::io_context io_context;
std::list<chat_server> servers;
for (int i = 1; i < argc; ++i)
{
tcp::endpoint endpoint(tcp::v4(), std::atoi(argv[i]));
servers.emplace_back(io_context, endpoint);
}
io_context.run();
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}
解决方案
没有 to_string 函数可以在 boost::asio::ip::tcp 上工作,就像在 boost::asio::ip 上一样
这很困惑。boost::asio::ip::tcp
是一个你从不实例化的类(它是一个对协议建模的静态类),boost::asio::ip
是一个命名空间,你不能期望打印一个命名空间。
然后,您的示例中有很多不相关的代码。为此,我们假设您的 chat_server 是试图打印端点的那个:
struct chat_server {
chat_server(boost::asio::io_context&, tcp::endpoint ep) {
std::cout << "Serving on " << ep << "\n";
}
};
打印类似的东西
Serving on 0.0.0.0:100
Serving on 0.0.0.0:110
Serving on 0.0.0.0:120
...
如果您真的想采用问题标题文字,您将打印端点的地址部分:
std::cout << "Serving on " << ep.address() << "\n";
哪个打印稍微没用的
Serving on 0.0.0.0
Serving on 0.0.0.0
Serving on 0.0.0.0
...
那是因为您没有绑定到接口。如果你这样做会更有用:
tcp::endpoint endpoint(ip::address_v4::loopback(), std::atoi(argv[i]));
Serving on 127.0.0.1
Serving on 127.0.0.1
Serving on 127.0.0.1
TL;博士
您需要的所有代码:
#include <boost/asio.hpp>
#include <iostream>
int main() {
std::cout << boost::asio::ip::address_v4::loopback() << "\n";
}
推荐阅读
- python - 为什么我不断收到 ValueError:解决:输入操作数 1 的核心维度 0 不匹配?
- c++ - centos中如何使用c++上传文件到ftp服务器?
- python - 有没有办法将神经网络层中的每个节点乘以特定值?(凯拉斯)
- c++ - Visual Studio 2019 map::operator[] 中的非合法优化?
- javascript - 更改字段条件的工具提示图标
- python - 从数据帧绘制的两条曲线之间的交点和返回点
- node.js - 如何在 $beforeUpdate 挂钩中获取整个 ObjectionJS 对象?
- excel - 如何使用 VBA 自动单击公司安全弹出窗口上的“发送”按钮
- reactjs - 使用 IIS API 实现 react redux
- java - 从 firebase 检索数据到 recyclerview