Обсуждение статьи "WebSocket для MetaTrader 5" - страница 2

 
Renat Fatkhullin:

Вы просто не понимаете и не умеете пользоваться этой функцией.

Эта функция моментально выдает доступное количество пришедших байт во входном буфере, а не говорит о том, что сокет живой. Функция очень важна и позволяет не уходить в синхронное ожидание, а вычитывать порционно данные, не теряя контроля над программой.

И TLS функции тоже правильные - они ведь даны для подготовленных пользователей, которые знают как и в какой последовательности ими пользоваться. Они не для тех, кто «вызвал и все».


Мало того, сокетные и tls функции в чистом виде те же самые, что использует терминал для raw/tls/https соединений терминал. То есть, все отлично работает. Эти же реализации работают в наших высоконагруженных решениях.

Сырые сетевые функции не для новичков и не для наивного использования. Надо достаточно хорошо понимать принципы и особенности сетевого взаимодействия. А если речь об TLS, то методы и последовательность  обработки handshake процесса.

Эта функция не имеет параметра буфера. О каком входном буфере речь?
Не знаю о каком понимании вы говорите и для каких юзеров, эту ошибку нашёл Ильяс и вроде принял за ошибку.
В том то и дело, что все пользователи ориентируются на примеры из документации для сокетов.
А продвинутые пользователи пишут спецификацию протокола, и апргрейды и разбор фрейма всё это понимаем.
Проблема в том, что функция SocketIsReadable(socket) не понятно что возвращает, для wss: фрейма. 

Документация по MQL5: Сетевые функции / SocketIsReadable
Документация по MQL5: Сетевые функции / SocketIsReadable
  • www.mql5.com
SocketIsReadable - Сетевые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Stanislav Korotky:

Есть какое-нибудь обоснование? Что за магическое число и почему оно подойдет для сообщения длиной 256 или 1500, например?

Обоснование? Да фиг его знает. С числом в переменной, читает без проблем. Длина выставлена на примерный максимальный размер входящего фрейма.
Можно и по максимуму поставить, не на что не влияет.

string CWs::Recv()
{
   uchar   rsp[]; //, res[];
   string  result  = "";
   //uint    timeout_check = GetTickCount() + timeout;

   //do
   //{
      uint len = 65536; //SocketIsReadable(socket);

      //if(len)
      //{
         int rsp_len = SocketTlsReadAvailable(socket, rsp, len);

         //if(rsp_len > 0)
         //{
            //ArrayInsert(res, rsp, ArraySize(res), 0);                       
            //break;
         //}   
      //}
   //}
   //while(GetTickCount() < timeout_check && !IsStopped());

   if(rsp_len > 0) //(ArraySize(res) > 0)
      result = Unpack(rsp, ArraySize(rsp));
   
  
   return(result);
}

А с функцией SocketIsReadable(socket) сам знаешь, что читает с ошибкой. 

То что возвращает SocketIsReadable(socket) в len, не подходит в  SocketTlsRead() и SocketTlsReadAvailable()

Документация по MQL5: Сетевые функции / SocketIsReadable
Документация по MQL5: Сетевые функции / SocketIsReadable
  • www.mql5.com
SocketIsReadable - Сетевые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Roman:

Эта функция не имеет параметра буфера. О каком входном буфере речь?
Не знаю о каком понимании вы говорите и для каких юзеров, эту ошибку нашёл Ильяс и вроде принял за ошибку.
В том то и дело, что все пользователи ориентируются на примеры из документации для сокетов.
А продвинутые пользователи пишут спецификацию протокола, и апргрейды и разбор фрейма всё это понимаем.
Проблема в том, что функция SocketIsReadable(socket) не понятно что возвращает, для wss: фрейма. 

То есть, вы вообще понятия не имеете о сокетах и их буферах, но учите нас ошибкам.

Проверка размера сырых данных во входящем буфере SocketIsReadible конечно не подходит к Tls функциям, которые работают с шифрованными данными, получаемыми в меньшем размере.

'Принял за ошибку' - люди умудряются любой аккуратный ответ принять за признание вины. Покажите четкий ответ.
 
Renat Fatkhullin:
То есть, вы вообще понятия не имеете о сокетах и их буферах, но учите нас ошибкам.

Проверка размера сырых данных во входящем буфере SocketIsReadible конечно не подходит к Tls функциям, которые работают с шифрованными данными, получаемыми в меньшем размере.

Вопрос был относительно функции SocketIsReadible, и то что функция имеет внутренний буфер, это понятно.
Вы же пишите за буфер функции SocketIsReadible, но это как то странно о нём упоминать, если пользователю он не доступен.

 
Статью прочитайте и посмотрите предложенный код.

Странно заявлять об ошибках, имея невоспроизводимый кусок кода из нескольких строк, когда речь идет о качестве реализации сложного протокола.

 
Roman:

Вопрос был относительно функции SocketIsReadible, и то что функция имеет внутренний буфер, это понятно.
Вы же пишите за буфер функции SocketIsReadible, но это как то странно о нём упоминать, если пользователю он не доступен.

Еще раз повторю - вы не понимаете сокетов и не знаете их особенностей.

Даже ошибаетесь с 'внутренними' буферами SocketIsReadable, которых нет. Чьи буфера в сокетах? Кто ими управляет? Как они работают и какие у них особенности?

Отсюда и неправильное использование с заявлением об ошибках, когда реальность расходится с наивным восприятием.



 
Renat Fatkhullin:

'Принял за ошибку' - люди умудряются любой аккуратный ответ принять за признание вины. Покажите четкий ответ.

.
il

r

il1

 
Roman:

.


Первая часть его ответа верная, обьясняет разницу между размерами сырых данных и расшифрованных.

А вот последний ответ - частный случай(поставить фикс размер) в виде костыля. Скорее всего на фоне очередного трехстрочного куска кода, где ничего кроме частной поправки/костыля предложить нельзя.

Ильяс не занимается сокетами. Никакого признания ошибки нет.

Для информации: в МТ5 реализацию сырых сокетов, tls, https и их производных писал я. Как до этого писал десятки реализаций сетевых протоколов начиная с 1995 года.

Поэтому странно спорить со мной. Десятки миллионов устройств работали и работают на моих реализациях.
 
Renat Fatkhullin:
Первая часть его ответа верная, обьясняет разницу между размерами сырых данных и расшифрованных.

А вот последний ответ - частный случай(поставить фикс размер) в виде костыля. Скорее всего на фоне очередного трехстрочного куска кода, где ничего кроме частной поправки/костыля предложить нельзя.

Ильяс не занимается сокетами. Никакого признания ошибки нет.

Для информации: в МТ5 реализацию сырых сокетов, tls, https и их производных писал я. Как до этого писал десятки реализаций сетевых протоколов начиная с 1995 года.

Поэтому странно спорить со мной. Десятки миллионов устройств работали и работают на моих реализациях.

Я понимаю ваш не оспоримый опыт. И спорить с вами не кто не собирался.
Но статья не раскрывает вопрос, как правильно использовать wss: в MQL!
Потому что автор статьи, так же не понимает этого момента, как и все остальные (даже продвинутые) пользователи. 
По этому и использую в своей реализации, фикс размер в виде костыля.

Покажите пожалуйста правильную вычитку wss: фрейма на MQL с учётом пула SocketIsReadable, все скажут только спасибо.

 
Roman:

Я понимаю ваш не оспоримый опыт. И спорить с вами не кто не собирался.
Но статья не раскрывает вопрос, как правильно использовать wss: в MQL!
Потому что автор статьи, так же не понимает этого момента, как и все остальные (даже продвинутые) пользователи. 
По этому и использую в своей реализации, фикс размер в виде костыля.

Покажите пожалуйста правильную вычитку wss: фрейма на MQL с учётом пула SocketIsReadable, все скажут только спасибо.

Сейчас нет времени, но надо бы мне сделать набор CSocketRaw, CSocketTLS, CSocketHTTP реализаций в стандартной библиотеке MQL5.

Будет часов 8 свободного времени, сделаю.