C ++ boost.asio сервер и клиентское соединение недостаточно - PullRequest
5 голосов
/ 18 ноября 2011

Я начал изучать boost.asio, и у меня возникли проблемы с недостаточной передачей данных по tcp-соединениям. Вот пример с официального сайта поддержки:

  #include <ctime>
#include <iostream>
#include <string>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

std::string make_daytime_string()
{
  using namespace std; // For time_t, time and ctime;
  time_t now = time(0);
  return ctime(&now);
}

int main()
{
  try
  {
    boost::asio::io_service io_service;

    tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13));

    for (;;)
    {
      tcp::socket socket(io_service);
      acceptor.accept(socket);

      std::string message = make_daytime_string();

      boost::system::error_code ignored_error;
      boost::asio::write(socket, boost::asio::buffer(message),
          boost::asio::transfer_all(), ignored_error);
    }
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

возникает вопрос, почему, если я хочу подключиться к этому серверу через клиента, я должен написать:

    boost::asio::io_service io_service;

tcp::resolver resolver(io_service);
tcp::resolver::query query(host_ip, "daytime"); //why daytime?
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::resolver::iterator end;

почему днем? Что это значит и где оно инициализируется на сервере, или я просто не пропустил?

есть полный код клиента: www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/tutorial/tutdaytime1.html спасибо за объяснение заранее

Ответы [ 3 ]

6 голосов
/ 18 ноября 2011

Дневное время - это просто другой протокол (например, FTP и т. Д.), В котором используется порт 13. Если вы хотите подключиться к серверу с определенным номером порта, ваш код будет выглядеть следующим образом:

tcp::resolver::query query(host_ip, "5678"); // 5678 is the port number
1 голос
/ 19 ноября 2011

daytime - имя службы, это хорошо описано в tcp::resolver::query документации

service_name

Строка, идентифицирующаязапрошенная услуга.Это может быть описательное имя или числовая строка, соответствующая номеру порта.Может быть пустой строкой, в этом случае все разрешенные конечные точки будут иметь номер порта 0.

0 голосов
/ 18 ноября 2011

"daytime" означает порт, используемый для дневных служб. Это 13, который вы видите у акцептора. Вот список известных портов (что бы это ни значило):

http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers

...