1.4.2.2. Обмен данными
Рисунок 1.4 Диаграмма взаимодействия при передачи данных
На рисунке 1.4 приведена диаграмма взаимодействия при обмене данными, рассмотрим каждый шаг.
Для отправки данных используется функция:
Таблица 1.15
Функция |
template< |
|
typename ConstBufferSequence, |
|
typename WriteHandler |
|
> |
|
void-or-deduced async_send( |
|
const ConstBufferSequence & buffers, |
|
WriteHandler handler |
|
); |
Описание функции |
Отправляет данные из буфера buffers, после выполнения |
|
вызывается обработчик передачи handler |
Описание параметров |
buffers – буфер |
|
handler – обработчик передачи |
Пример: |
|
int size = 1024;
char buff_write[size];
sock.async_send(boost::asio::buffer(buff_write,size),boost::bind(boost::bind(handle,_1,_
2));
После записи данных в буфер для отправки, данные будут поделены на пакеты (если это необходимо) и отправлены получателю.
Для получения данных из буфера используется функция:
Таблица 1.16
Функция |
template< |
|
typename MutableBufferSequence, |
|
typename ReadHandler |
|
> |
|
void-or-deduced async_receive( |
|
const MutableBufferSequence & buffers, |
|
ReadHandler handler |
|
); |
Описание функции |
При поступлении данных , читает данные в буфер buffers, |
|
после выполнения вызывается обработчик приёма handler |
Описание параметров |
buffers – буфер |
|
handler – обработчик приёма |
Сигнатура функции обработчика для приёма и передачи должно быть:
void handler(const boost::system::error_code& error, std::size_t bytes_transferred);
Если объект err существует, то произошла ошибка, в противном случае данные приняты/переданы. bytes_transferred – количество байт принятых/переданых.
1.4.2.3. Закрытие соединения
Для корректного завершения работы с socket и acceptor используется функция:
|
Таблица 1.17 |
|
|
|
|
Функция |
boost::system::error_code close( |
|
|
boost::system::error_code & ec |
|
|
); |
|
|
|
|
Описание функции |
Закрывает сокет. Если произошла ошибка возвращает его в |
|
|
объект ec. |
|
1.4.2.4. Обработка ошибок
Для обработки ошибок используется boost::system::error_code. Объект содержит в себе код произошедшей ошибки.
Таблица 1.18
Функция |
int value() const noexcept; |
Описание функции |
Возвращает номер ошибки |
1.4.3. Клиент-серверные приложения без установления соединения
Рисунок 1.5 Диаграмма взаимодействия датаграмных сокетов.
При использовании датаграмных сокетов, не происходит процедуры установления соединения, поэтому их использование гораздо проще.
На рисунке 1.5 приведена диаграмма взаимодействия, при использовании датаграмных сокетов, рассмотрим каждый шаг:
a)Создание объекта ip::udp::socket, привязка его к локальному адресу и порту.
Таблица 1.19
Конструктор |
basic_datagram_socket( |
|
boost::asio::io_service & io_service, |
|
const endpoint_type & endpoint |
|
); |
Описание параметров |
io_service – объект для работы с асинхронными операциями |
|
endpoint – конечная точка к которой будет подключён |
|
socket(Локальный адрес и порт) |
Пример:
boost::asio::ip::udp::socket sock(service,ep);
b) Отправка сообщений осуществляется с помощью функции:
Таблица 1.20
Функция |
template< |
|
typename ConstBufferSequence, |
|
typename WriteHandler |
|
> |
|
void-or-deduced async_send_to( |
|
const ConstBufferSequence & buffers, |
|
const endpoint_type & destination, |
|
WriteHandler handler |
|
); |
|
|
Описание функции |
Отправляет данные из буфера buffers на удалённый адрес |
|
конечной точки destination. После отправки данных вызывает |
|
обработчик handler |
Описание параметров |
buffers – буфер |
|
destination – удалённая конечная точка |
|
handler – обработчик передачи |