1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-12-27 02:43:54 +02:00

Доработки по TCP

This commit is contained in:
Anton Titovets 2024-12-14 17:30:41 +03:00
parent 40844f6a4d
commit 06ae318609
11 changed files with 6286 additions and 6210 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1,69 +1,36 @@
use std::io::{Read, Write};
use std::net::TcpStream;
use native_tls::TlsStream;
use std::time::{Duration, Instant};
pub enum Connection {
Tcp(TcpStream),
Tls(TlsStream<TcpStream>),
}
impl Connection {
pub fn write(&mut self, data: &[u8]) -> std::io::Result<usize> {
match self {
Connection::Tcp(stream) => stream.write(data),
Connection::Tls(stream) => stream.write(data),
}
}
pub fn read(&mut self, buffer: &mut [u8]) -> std::io::Result<usize> {
match self {
Connection::Tcp(stream) => stream.read(buffer),
Connection::Tls(stream) => stream.read(buffer),
}
}
}
use std::time::{Duration};
/// Отправляет данные
pub fn send(connection: &mut Connection, data: Vec<u8>, timeout_ms: i32) -> bool {
pub fn send(connection: &mut TcpStream, data: Vec<u8>, timeout_ms: i32) -> bool {
match connection {
Connection::Tcp(stream) => {
stream.set_write_timeout(Some(Duration::from_millis(timeout_ms as u64))).ok();
}
Connection::Tls(stream) => {
stream.get_ref().set_write_timeout(Some(Duration::from_millis(timeout_ms as u64))).ok();
}
if timeout_ms > 0 {
let timeout = Duration::from_millis(timeout_ms as u64);
connection.set_write_timeout(Some(timeout)).ok();
}
match connection.write(&data) {
Ok(_) => true,
Ok(_) => connection.flush().is_ok(),
Err(_) => false, // Ошибка при отправке данных
}
}
/// Считывает данные
pub fn receive(
connection: &mut Connection,
timeout_ms: i32,
max_attempts: i32,
connection: &mut TcpStream,
max_data_size: i32,
timeout_ms: i32,
) -> Vec<u8> {
const BUFFER_SIZE: usize = 4096; // Фиксированный размер буфера
const BUFFER_SIZE: usize = 1024; // Фиксированный размер буфера
let mut result = Vec::new();
let mut buffer = vec![0u8; BUFFER_SIZE];
let mut attempts = 0;
// Устанавливаем таймаут для чтения
let timeout = Duration::from_millis(timeout_ms as u64);
match connection {
Connection::Tcp(stream) => {
stream.set_read_timeout(Some(timeout)).ok();
}
Connection::Tls(stream) => {
stream.get_ref().set_read_timeout(Some(timeout)).ok();
}
if timeout_ms > 0 {
let timeout = Duration::from_millis(timeout_ms as u64);
connection.set_read_timeout(Some(timeout)).ok();
}
loop {
@ -74,18 +41,9 @@ pub fn receive(
match connection.read(&mut buffer) {
Ok(0) => break, // Конец данных (EOF)
Ok(size) => {
result.extend_from_slice(&buffer[..size]);
attempts = 0; // Сбрасываем счетчик попыток при успешном чтении
}
Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock => {
attempts += 1;
if attempts >= max_attempts {
break; // Превышено число попыток ожидания
}
continue; // Пробуем снова
}
Err(_) => break // Любая другая ошибка
Ok(size) => result.extend_from_slice(&buffer[..size]),
Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock => break,
Err(_) => break
}
}

View File

@ -2,9 +2,7 @@ mod methods;
use addin1c::{name, Variant};
use crate::core::getset;
use methods::Connection;
use std::net::TcpStream;
use native_tls::{TlsConnector};
use crate::component::methods::disconnect;
// МЕТОДЫ КОМПОНЕНТЫ -------------------------------------------------------------------------------
@ -14,7 +12,7 @@ pub const METHODS: &[&[u16]] = &[
name!("Connect"), // 0
name!("Disconnect"), // 1
name!("Read"), // 2
name!("Write"), // 3
name!("Send"), // 3
];
// Число параметров функций компоненты
@ -22,7 +20,7 @@ pub fn get_params_amount(num: usize) -> usize {
match num {
0 => 0,
1 => 0,
2 => 3,
2 => 2,
3 => 2,
_ => 0,
}
@ -43,11 +41,10 @@ pub fn cal_func(obj: &mut AddIn, num: usize, params: &mut [Variant]) -> Box<dyn
let timeout = params[0].get_i32().unwrap_or(0);
let max_attempts= params[1].get_i32().unwrap_or(0);
let maxsize = params[2].get_i32().unwrap_or(0);
if let Some(ref mut connection) = obj.connection {
Box::new(methods::receive(connection, timeout, max_attempts, maxsize))
Box::new(methods::receive(connection, maxsize, timeout))
} else {
Box::new(Vec::<u8>::new()) // Если соединения нет, возвращаем пустой массив
}
@ -56,7 +53,7 @@ pub fn cal_func(obj: &mut AddIn, num: usize, params: &mut [Variant]) -> Box<dyn
let empty_array: [u8; 0] = [];
let data = params[0].get_blob().unwrap_or(&empty_array);
let data = params[0].get_blob().unwrap_or(&empty_array);
let timeout = params[1].get_i32().unwrap_or(0);
if let Some(ref mut connection) = obj.connection {
@ -76,15 +73,13 @@ pub fn cal_func(obj: &mut AddIn, num: usize, params: &mut [Variant]) -> Box<dyn
// Синонимы
pub const PROPS: &[&[u16]] = &[
name!("Address"),
name!("SSL"),
name!("Address")
];
pub struct AddIn {
pub address: String,
pub use_ssl: bool,
connection: Option<Connection>,
connection: Option<TcpStream>,
}
impl AddIn {
@ -92,48 +87,29 @@ impl AddIn {
pub fn new() -> Self {
AddIn {
address: String::new(),
use_ssl: false,
connection: None,
}
}
/// Подключается к серверу
pub fn connect(&mut self) -> bool {
if self.address.is_empty() {
return false; // Ошибка: пустой адрес
}
if self.use_ssl {
let connector = match TlsConnector::new() {
Ok(conn) => conn,
Err(_) => return false, // Ошибка при создании TLS-коннектора
};
let stream = match TcpStream::connect(&self.address) {
Ok(s) => s,
Err(_) => return false, // Ошибка при подключении
};
match connector.connect(&self.address, stream) {
Ok(tls_stream) => {
self.connection = Some(Connection::Tls(tls_stream));
true
}
Err(_) => false, // Ошибка при установлении TLS
}
} else {
match TcpStream::connect(&self.address) {
Ok(tcp_stream) => {
self.connection = Some(Connection::Tcp(tcp_stream));
true
}
Err(_) => false, // Ошибка при подключении
match TcpStream::connect(&self.address) {
Ok(tcp_stream) => {
self.connection = Some(tcp_stream);
true
}
Err(_) => false, // Ошибка при подключении
}
}
pub fn get_field_ptr(&self, index: usize) -> *const dyn getset::ValueType {
match index {
0 => &self.address as &dyn getset::ValueType as *const _,
1 => &self.use_ssl as &dyn getset::ValueType as *const _,
_ => panic!("Index out of bounds"),
}
}

Binary file not shown.

Binary file not shown.

View File

@ -47,23 +47,20 @@
// !NOCLI
// Открыть соединение
// Создает TCP/TLS соединение
// Создает TCP соединение
//
// Параметры:
// Адрес - Строка - Адрес и порт для подключения - address
// SSL - Булево - Признак использования защищенного соединения - ssl
// Адрес - Строка - Адрес и порт для подключения - address
//
// Возвращаемое значение:
// Неопределено, Произвольный - Возвращает объект TCP клиента при успешном подключении или неопределено
Функция ОткрытьСоединение(Знач Адрес, Знач SSL = Ложь) Экспорт
Функция ОткрытьСоединение(Знач Адрес) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Адрес);
OPI_ПреобразованиеТипов.ПолучитьБулево(SSL);
TCPКлиент = OPI_Инструменты.ПолучитьКомпоненту("TCPClient");
TCPКлиент.Address = Адрес;
TCPКлиент.SSL = SSL;
Успех = TCPКлиент.Connect();
@ -85,79 +82,141 @@
КонецФункции
// !NOCLI
// Получить данные
// Прочитать двоичные данные
// Читает данные из указанного соединения
//
// Примечание:
// Метод пытается прочесть данные интервалами, длительность которых указана в параметре ДлительностьПопытки.^^
// За максимальное число попыток отвечает параметр ЧислоПопыток. При успешном получении новых данных число попыток сбрасывается.
// При работе с бесконечным потоком входящих данных обязательно указание параметра МаксимальныйРазмер, так как^^
// бесконечный сброс попыток при получении данных может привести к зависанию
// бесконечное получение данных может привести к зависанию
// При закрытии соединения, ошибке или обнаружении EOF чтение завершается в любом случае
//
// Параметры:
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
// ДлительностьПопытки - Число - Интервал между попытками получения данных - timeout
// ЧислоПопыток - Число - Максимальное число попыток получения данных - attempts
// МаксимальныйРазмер - Число - Максимальный размер данных. 0 > без ограничений - size
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
// МаксимальныйРазмер - Число - Максимальный размер данных (байт). 0 > без ограничений - size
// Таймаут - Число - Таймаут ожидания данных (мс). 0 > без ограничений - timeout
//
// Возвращаемое значение:
// ДвоичныеДанные - Полученные данные
Функция ПолучитьДанные(Знач Соединение
, Знач ДлительностьПопытки = 200
, Знач ЧислоПопыток = 5
, Знач МаксимальныйРазмер = 0) Экспорт
Функция ПрочитатьДвоичныеДанные(Знач Соединение, Знач МаксимальныйРазмер = 0, Знач Таймаут = 5000) Экспорт
OPI_ПреобразованиеТипов.ПолучитьЧисло(ДлительностьПопытки);
OPI_ПреобразованиеТипов.ПолучитьЧисло(ЧислоПопыток);
OPI_ПреобразованиеТипов.ПолучитьЧисло(Таймаут);
OPI_ПреобразованиеТипов.ПолучитьЧисло(МаксимальныйРазмер);
Возврат Соединение.Read(ДлительностьПопытки, ЧислоПопыток, МаксимальныйРазмер);
Данные = Соединение.Read(МаксимальныйРазмер, Таймаут);
Возврат Данные;
КонецФункции
// !NOCLI
// Прочитать строку
// Читает данные из указанного соединения в виде строки
//
// Примечание:
// При закрытии соединения, ошибке или обнаружении EOF чтение завершается в любом случае
//
// Параметры:
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
// Кодировка - Строка - Кодировка преобразования данных в строку - enc
// Таймаут - Число - Таймаут ожидания данных (мс). 0 > без ограничений - timeout
//
// Возвращаемое значение:
// Строка - Полученные данные в виде строки
Функция ПрочитатьСтроку(Знач Соединение, Знач Кодировка = "UTF-8", Знач Таймаут = 5000) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
Данные = ПрочитатьДвоичныеДанные(Соединение, , Таймаут);
Данные = ПолучитьСтрокуИзДвоичныхДанных(Данные, Кодировка);
Возврат Данные;
КонецФункции
// !NOCLI
// Отправить двоичные данные
// Отправляет двоичные данные через указанное соединение
//
// Параметры:
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
// Данные - ДвоичныеДанные - Данные для отправки - data
// Таймаут - Число - Таймаут ожидания записи (мс). 0 > без ограничений - timeout
//
// Возвращаемое значение:
// Булево - Признак успешного выполнения
Функция ОтправитьДвоичныеДанные(Знач Соединение, Знач Данные, Знач Таймаут = 5000) Экспорт
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
OPI_ПреобразованиеТипов.ПолучитьЧисло(Таймаут);
Результат = Соединение.Send(Данные, Таймаут);
Возврат Результат;
КонецФункции
// !NOCLI
// Отправить строку
// Отправляет данные в виде строки через указанное соединение
//
// Параметры:
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
// Данные - Строка - Данные для отправки в виде строки - data
// Кодировка - Строка - Кодировка для записи исходящей строки в поток - enc
// Таймаут - Число - Таймаут ожидания записи (мс). 0 > без ограничений - timeout
//
// Возвращаемое значение:
// Булево - Признак успешного выполнения
Функция ОтправитьСтроку(Знач Соединение, Знач Данные, Знач Кодировка = "UTF-8", Знач Таймаут = 5000) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Данные);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
ДанныеДД = ПолучитьДвоичныеДанныеИзСтроки(Данные, Кодировка);
Результат = ОтправитьДвоичныеДанные(Соединение, ДанныеДД, Таймаут);
Возврат Результат;
КонецФункции
// Подключиться и получить данные
// Создает соединение и читает данные до конца или по ограничениям
//
// Примечание:
// Метод пытается прочесть данные интервалами, длительность которых указана в параметре ДлительностьПопытки.^^
// За максимальное число попыток отвечает параметр ЧислоПопыток. При успешном получении новых данных число попыток сбрасывается.
// При работе с бесконечным потоком входящих данных обязательно указание параметра МаксимальныйРазмер, так как^^
// бесконечный сброс попыток при получении данных может привести к зависанию
// бесконечное получение данных может привести к зависанию
// При закрытии соединения, ошибке или обнаружении EOF чтение завершается в любом случае
//
// Параметры:
// Адрес - Строка - Адрес и порт для подключения - address
// SSL - Булево - Признак использования защищенного соединения - ssl
// ДлительностьПопытки - Число - Интервал между попытками получения данных - timeout
// ЧислоПопыток - Число - Максимальное число попыток получения данных - attempts
// МаксимальныйРазмер - Число - Максимальный размер данных. 0 > без ограничений - size
// Строкой - Булево - Истина > возвращает строку, Ложь > двоичные данные - string
// Кодировка - Строка - Кодировка получаемых данных - enc
// Адрес - Строка - Адрес и порт для подключения - address
// МаксимальныйРазмер - Число - Максимальный размер данных. 0 > без ограничений - size
// Таймаут - Число - Таймаут ожидания данных - timeout
// Строкой - Булево - Истина > возвращает строку, Ложь > двоичные данные - string
// Кодировка - Строка - Кодировка получаемых данных - enc
//
// Возвращаемое значение:
// Строка, ДвоичныеДанные - Полученные данные
Функция ПодключитьсяИПолучитьДанные(Знач Адрес
, Знач SSL = Ложь
, Знач ДлительностьПопытки = 0
, Знач ЧислоПопыток = 5
, Знач МаксимальныйРазмер = 0
, Знач Таймаут = 5000
, Знач Строкой = Истина
, Знач Кодировка = "UTF-8") Экспорт
OPI_ПреобразованиеТипов.ПолучитьБулево(Строкой);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
Соединение = ОткрытьСоединение(Адрес, SSL);
Соединение = ОткрытьСоединение(Адрес);
Если Не ЗначениеЗаполнено(Соединение) Тогда
ВызватьИсключение "Не удалось создать Соединение";
КонецЕсли;
Сообщение = ПолучитьДанные(Соединение, ДлительностьПопытки, ЧислоПопыток, МаксимальныйРазмер);
Сообщение = ПрочитатьДвоичныеДанные(Соединение, МаксимальныйРазмер, Таймаут);
Если Строкой Тогда
Сообщение = ПолучитьСтрокуИзДвоичныхДанных(Сообщение);
Сообщение = ПолучитьСтрокуИзДвоичныхДанных(Сообщение, Кодировка);
КонецЕсли;
ЗакрытьСоединение(Соединение);

View File

@ -2038,9 +2038,9 @@
КонецФункции
Функция ПолучитьОбщийМодуль(Знач Имя)
Модуль = Вычислить(Имя);
Возврат Модуль;
КонецФункции

View File

@ -47,23 +47,20 @@
// !NOCLI
// Открыть соединение
// Создает TCP/TLS соединение
// Создает TCP соединение
//
// Параметры:
// Адрес - Строка - Адрес и порт для подключения - address
// SSL - Булево - Признак использования защищенного соединения - ssl
// Адрес - Строка - Адрес и порт для подключения - address
//
// Возвращаемое значение:
// Неопределено, Произвольный - Возвращает объект TCP клиента при успешном подключении или неопределено
Функция ОткрытьСоединение(Знач Адрес, Знач SSL = Ложь) Экспорт
Функция ОткрытьСоединение(Знач Адрес) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Адрес);
OPI_ПреобразованиеТипов.ПолучитьБулево(SSL);
TCPКлиент = OPI_Инструменты.ПолучитьКомпоненту("TCPClient");
TCPКлиент.Address = Адрес;
TCPКлиент.SSL = SSL;
Успех = TCPКлиент.Connect();
@ -85,79 +82,141 @@
КонецФункции
// !NOCLI
// Получить данные
// Прочитать двоичные данные
// Читает данные из указанного соединения
//
// Примечание:
// Метод пытается прочесть данные интервалами, длительность которых указана в параметре ДлительностьПопытки.^^
// За максимальное число попыток отвечает параметр ЧислоПопыток. При успешном получении новых данных число попыток сбрасывается.
// При работе с бесконечным потоком входящих данных обязательно указание параметра МаксимальныйРазмер, так как^^
// бесконечный сброс попыток при получении данных может привести к зависанию
// бесконечное получение данных может привести к зависанию
// При закрытии соединения, ошибке или обнаружении EOF чтение завершается в любом случае
//
// Параметры:
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
// ДлительностьПопытки - Число - Интервал между попытками получения данных - timeout
// ЧислоПопыток - Число - Максимальное число попыток получения данных - attempts
// МаксимальныйРазмер - Число - Максимальный размер данных. 0 > без ограничений - size
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
// МаксимальныйРазмер - Число - Максимальный размер данных (байт). 0 > без ограничений - size
// Таймаут - Число - Таймаут ожидания данных (мс). 0 > без ограничений - timeout
//
// Возвращаемое значение:
// ДвоичныеДанные - Полученные данные
Функция ПолучитьДанные(Знач Соединение
, Знач ДлительностьПопытки = 200
, Знач ЧислоПопыток = 5
, Знач МаксимальныйРазмер = 0) Экспорт
Функция ПрочитатьДвоичныеДанные(Знач Соединение, Знач МаксимальныйРазмер = 0, Знач Таймаут = 5000) Экспорт
OPI_ПреобразованиеТипов.ПолучитьЧисло(ДлительностьПопытки);
OPI_ПреобразованиеТипов.ПолучитьЧисло(ЧислоПопыток);
OPI_ПреобразованиеТипов.ПолучитьЧисло(Таймаут);
OPI_ПреобразованиеТипов.ПолучитьЧисло(МаксимальныйРазмер);
Возврат Соединение.Read(ДлительностьПопытки, ЧислоПопыток, МаксимальныйРазмер);
Данные = Соединение.Read(МаксимальныйРазмер, Таймаут);
Возврат Данные;
КонецФункции
// !NOCLI
// Прочитать строку
// Читает данные из указанного соединения в виде строки
//
// Примечание:
// При закрытии соединения, ошибке или обнаружении EOF чтение завершается в любом случае
//
// Параметры:
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
// Кодировка - Строка - Кодировка преобразования данных в строку - enc
// Таймаут - Число - Таймаут ожидания данных (мс). 0 > без ограничений - timeout
//
// Возвращаемое значение:
// Строка - Полученные данные в виде строки
Функция ПрочитатьСтроку(Знач Соединение, Знач Кодировка = "UTF-8", Знач Таймаут = 5000) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
Данные = ПрочитатьДвоичныеДанные(Соединение, , Таймаут);
Данные = ПолучитьСтрокуИзДвоичныхДанных(Данные, Кодировка);
Возврат Данные;
КонецФункции
// !NOCLI
// Отправить двоичные данные
// Отправляет двоичные данные через указанное соединение
//
// Параметры:
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
// Данные - ДвоичныеДанные - Данные для отправки - data
// Таймаут - Число - Таймаут ожидания записи (мс). 0 > без ограничений - timeout
//
// Возвращаемое значение:
// Булево - Признак успешного выполнения
Функция ОтправитьДвоичныеДанные(Знач Соединение, Знач Данные, Знач Таймаут = 5000) Экспорт
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
OPI_ПреобразованиеТипов.ПолучитьЧисло(Таймаут);
Результат = Соединение.Send(Данные, Таймаут);
Возврат Результат;
КонецФункции
// !NOCLI
// Отправить строку
// Отправляет данные в виде строки через указанное соединение
//
// Параметры:
// Соединение - Произвольный - Соединение, см. ОткрытьСоединение - tcp
// Данные - Строка - Данные для отправки в виде строки - data
// Кодировка - Строка - Кодировка для записи исходящей строки в поток - enc
// Таймаут - Число - Таймаут ожидания записи (мс). 0 > без ограничений - timeout
//
// Возвращаемое значение:
// Булево - Признак успешного выполнения
Функция ОтправитьСтроку(Знач Соединение, Знач Данные, Знач Кодировка = "UTF-8", Знач Таймаут = 5000) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Данные);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
ДанныеДД = ПолучитьДвоичныеДанныеИзСтроки(Данные, Кодировка);
Результат = ОтправитьДвоичныеДанные(Соединение, ДанныеДД, Таймаут);
Возврат Результат;
КонецФункции
// Подключиться и получить данные
// Создает соединение и читает данные до конца или по ограничениям
//
// Примечание:
// Метод пытается прочесть данные интервалами, длительность которых указана в параметре ДлительностьПопытки.^^
// За максимальное число попыток отвечает параметр ЧислоПопыток. При успешном получении новых данных число попыток сбрасывается.
// При работе с бесконечным потоком входящих данных обязательно указание параметра МаксимальныйРазмер, так как^^
// бесконечный сброс попыток при получении данных может привести к зависанию
// бесконечное получение данных может привести к зависанию
// При закрытии соединения, ошибке или обнаружении EOF чтение завершается в любом случае
//
// Параметры:
// Адрес - Строка - Адрес и порт для подключения - address
// SSL - Булево - Признак использования защищенного соединения - ssl
// ДлительностьПопытки - Число - Интервал между попытками получения данных - timeout
// ЧислоПопыток - Число - Максимальное число попыток получения данных - attempts
// МаксимальныйРазмер - Число - Максимальный размер данных. 0 > без ограничений - size
// Строкой - Булево - Истина > возвращает строку, Ложь > двоичные данные - string
// Кодировка - Строка - Кодировка получаемых данных - enc
// Адрес - Строка - Адрес и порт для подключения - address
// МаксимальныйРазмер - Число - Максимальный размер данных. 0 > без ограничений - size
// Таймаут - Число - Таймаут ожидания данных - timeout
// Строкой - Булево - Истина > возвращает строку, Ложь > двоичные данные - string
// Кодировка - Строка - Кодировка получаемых данных - enc
//
// Возвращаемое значение:
// Строка, ДвоичныеДанные - Полученные данные
Функция ПодключитьсяИПолучитьДанные(Знач Адрес
, Знач SSL = Ложь
, Знач ДлительностьПопытки = 0
, Знач ЧислоПопыток = 5
, Знач МаксимальныйРазмер = 0
, Знач Таймаут = 5000
, Знач Строкой = Истина
, Знач Кодировка = "UTF-8") Экспорт
OPI_ПреобразованиеТипов.ПолучитьБулево(Строкой);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Кодировка);
Соединение = ОткрытьСоединение(Адрес, SSL);
Соединение = ОткрытьСоединение(Адрес);
Если Не ЗначениеЗаполнено(Соединение) Тогда
ВызватьИсключение "Не удалось создать Соединение";
КонецЕсли;
Сообщение = ПолучитьДанные(Соединение, ДлительностьПопытки, ЧислоПопыток, МаксимальныйРазмер);
Сообщение = ПрочитатьДвоичныеДанные(Соединение, МаксимальныйРазмер, Таймаут);
Если Строкой Тогда
Сообщение = ПолучитьСтрокуИзДвоичныхДанных(Сообщение);
Сообщение = ПолучитьСтрокуИзДвоичныхДанных(Сообщение, Кодировка);
КонецЕсли;
ЗакрытьСоединение(Соединение);