1.4.2. Клиент-серверные приложения с установлением соединения
1.4.2.1. Установка соединения
Серверная часть
Рисунок 1.2 Диаграмма взаимодействия при установлении соединения (Серверная часть)
На рисунке 1.2 приведена диаграмма взаимодействия при установлении соединения на стороне сервера, рассмотрим каждый шаг.
a)Создание объекта ip::tcp::acceptor, привязка его к локальному адресу и порту, создание очереди запросов на подключение
Таблица 1.11
Конструктор |
basic_socket_acceptor( |
|
boost::asio::io_service & io_service, |
|
const endpoint_type & endpoint, |
|
bool reuse_addr = true |
|
); |
Описание |
io_service – объект для работы с асинхронными операциями |
параметров |
endpoint – конечная точка к которой будет подключён |
|
acceptor(Локальный адрес и порт) |
|
reuse_addr – опция, которая определяет, будет ли разрешено |
|
использование уже задействованного адреса (по умолчанию |
|
разрешено) |
|
|
Пример : |
|
boost::asio::io_service service();
boost::asio::ip::tcp::endpoint ep(boost::asio::ip::tcp::v4(), 5000); boost::asio::ip::tcp::acceptor acceptor(service,ep);
b) Перевод в режим асинхронного прослушивания запросов и назначение обработчика, вызывающегося при установлении соединения
Таблица 1.12
Функция |
template< |
|
typename Protocol1, |
|
typename SocketService, |
|
typename AcceptHandler |
|
> |
|
void-or-deduced async_accept( |
|
basic_socket< Protocol1, SocketService > & peer, |
|
AcceptHandler handler, |
|
); |
|
|
Описание функции |
Переводит acceptor в режим асинхронного прослушивания |
|
запросов, назначает обработчик handler, который будет |
|
вызываться при установлении соединения |
Описание параметров |
peer – сокет, к которому будет совершено первое подключение. |
|
handler – обработчик |
Пример: |
|
boost::asio::ip::tcp::socket sock (service); acceptor.async_accept(sock,boost::bind(handle,_1));
При поступлении запросов на соединение, происходит процедура установления соединения между сокетом peer и удалённым узлом. После этого объект io_service вызывает обработчик handler. Сигнатура функции обработчика должна быть:
void handler(const boost::system::error_code& error);
Если объект err существует, то произошла ошибка, в противном случае соединение успешно установлено.
В обработчике необходимо вновь вызвать функцию async_accept, если вы хотите принимать новые подключения или закрыть acceptor.
Клиентская часть
Рисунок 1.3 Диаграмма взаимодействия при установлении соединения (Клиентская часть)
На рисунке 1.3 приведена диаграмма взаимодействия при установлении соединения на стороне клиента, рассмотрим каждый шаг:
a) Создание объекта ip::tcp::socket
|
Таблица 1.13 |
|
|
|
|
Конструктор |
basic_stream_socket( |
|
|
boost::asio::io_service & io_service |
|
|
); |
|
|
|
|
Описание параметров |
io_service – объект для работы с асинхронными операциями |
|
b)В Boost::Asio в отличии от SOCKET API не нужно вручную привязывать сокет к определённому локальному адресу или порту, так как до вызова функции async_connect () сокет не создаётся. При вызове данной функции создаётся сокет, использующий произвольный свободный порт, и происходит попытка соединения.
Таблица 1.14
Функция |
template< |
|
typename ConnectHandler |
|
> |
|
void-or-deduced async_connect( |
|
const endpoint_type & peer_endpoint, |
|
ConnectHandler handler |
|
); |
Описание функции |
Открывает системный сокет, использующий произвольный |
|
незанятый порт, пытается установить соединение |
Описание параметров |
peer_endpoint – удалённая конечная точка |
|
handler – обработчик соединения |
Пример: |
|
sock.async_connect(ep, boost::bind(handle,_1));
После успешного соединения объект io_service вызывает обработчик handler. Сигнатура функции обработчика должно быть:
void handler(const boost::system::error_code& error);
Если объект err существует, то произошла ошибка, в противном случае соединение успешно установлено.