Как подключиться / отключиться от сервера? - PullRequest
1 голос
/ 17 мая 2010

Я использую последнюю версию boost и boost.asio.
У меня есть этот класс:

enum IPVersion
{
    IPv4,
    IPv6
};

template <IPVersion version = IPv4>
class Connection
{
private:
    boost::asio::io_service io_service;
    boost::asio::ip::tcp::resolver resolver;
    boost::asio::ip::tcp::resolver::query query;
    boost::asio::ip::tcp::resolver::iterator iterator;
public:
    Connection(std::string host, std::string port);

    virtual void connect() { iterator = resolver.resolve(query); } // Is this the moment where the client actually connects?
    virtual void disconnect() { /* what goes in here? */ }
};

Должен ли я позвонить io_service::stop(), а затем на мой Connection::connect() вызов io_service::reset(), прежде чем разрешить запрос?

1 Ответ

1 голос
/ 17 мая 2010

Как правило, после того, как вы позвонили на io_service::run, часто мало причин позвонить на io_service::stop или io_service::reset.

В приведенном выше коде метод connect - это , а не , который собирается активно устанавливать соединение - tcp::resolver::resolve просто превращает запрос (например, имя хоста или IP-адрес и т. Д.) В конечная точка TCP, которую можно использовать для подключения сокета. Обычно вам нужно разыменовать итератор, возвращаемый resolver::resolve, и передать его в boost::asio::ip::tcp::socket метод connect объекта (или одного из асинхронных вариантов) для соединения с конечной точкой.

Хороший пример тому - учебники по Asio. См. Первый пример синхронного TCP-сервера для дневного времени здесь: http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/tutorial/tutdaytime1.html. Обратите внимание, что сначала выполняется код:

tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

чтобы превратить объект запроса в конечную точку TCP, а затем:

socket.connect(*endpoint_iterator++, error);

для подключения объекта сокета к этой конечной точке.

Что касается метода disconnect, это полностью зависит от приложения. Но обычно вам необходимо отслеживать активное соединение, инкапсулируя объект socket, который вы можете при необходимости закрыть при вызове disconnect. Для примера рассмотрим учебник под названием «Daytime 3 - Асинхронный TCP-сервер в дневное время» здесь: http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/tutorial/tutdaytime3.html

...