如何打印到标准输出 a boost::asio::ip::tcp::v4
How to print out to standard output a boost::asio::ip::tcp::v4
我是 运行 来自 boost.asio 示例的 c++11 聊天示例并尝试打印出 tcp::v4() return 值以查看什么 ip 地址服务器正在使用。没有像在 boost::asio::ip 上那样在 boost::asio::ip::tcp 上工作的 to_string 函数。
以下是聊天示例 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;
}
There is no to_string function that works on boost::asio::ip::tcp as it does on boost::asio::ip
这很困惑。 boost::asio::ip::tcp
是一个你永远不会实例化的 class(它是一个静态的 class 建模协议),boost::asio::ip
是一个命名空间,你不能指望打印一个命名空间。
那么,您的示例中有很多不相关的代码。让我们假设你的 chat_server 是试图打印 end-points:
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;DR
您需要的所有代码:
#include <boost/asio.hpp>
#include <iostream>
int main() {
std::cout << boost::asio::ip::address_v4::loopback() << "\n";
}
我是 运行 来自 boost.asio 示例的 c++11 聊天示例并尝试打印出 tcp::v4() return 值以查看什么 ip 地址服务器正在使用。没有像在 boost::asio::ip 上那样在 boost::asio::ip::tcp 上工作的 to_string 函数。
以下是聊天示例 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;
}
There is no to_string function that works on boost::asio::ip::tcp as it does on boost::asio::ip
这很困惑。 boost::asio::ip::tcp
是一个你永远不会实例化的 class(它是一个静态的 class 建模协议),boost::asio::ip
是一个命名空间,你不能指望打印一个命名空间。
那么,您的示例中有很多不相关的代码。让我们假设你的 chat_server 是试图打印 end-points:
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;DR
您需要的所有代码:
#include <boost/asio.hpp>
#include <iostream>
int main() {
std::cout << boost::asio::ip::address_v4::loopback() << "\n";
}