Как вывести на стандартный вывод boost :: asio :: ip :: tcp :: v4 - PullRequest
2 голосов
/ 26 мая 2020

Я запускаю пример чата c ++ 11 из примеров boost.asio и пытаюсь распечатать возвращаемое значение tcp :: v4 (), чтобы узнать, какой IP-адрес использует сервер. Нет функции to_string, которая работает с boost :: asio :: ip :: tcp, как с boost :: asio :: ip.

Вот основная функция с сервера. 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;
}

1 Ответ

1 голос
/ 26 мая 2020

Нет функции to_string, которая работает с boost :: asio :: ip :: tcp, как с boost :: asio :: ip

Это сбивает с толку. boost::asio::ip::tcp - это класс, который вы никогда не создаете (это статический c класс, моделирующий протокол), boost::asio::ip - это пространство имен, вы не можете рассчитывать напечатать пространство имен.

Тогда есть в вашем образце много нерелевантного кода. Предположим, что ваш chat_server пытался распечатать конечные точки:

Live On Coliru

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
...

Это потому, что вы не привязались к интерфейсу. Немного полезнее, если вы:

Live On Coliru

        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";
}
...