Терминал закрывает Socket до OnDeInit?

 

Нужно в сокет отправить сообщение по завершению работы эксперта. Делаю так

input string Address = "127.0.0.1";
input int    Port   = 8080;

int socket;
//+------------------------------------------------------------------+
int OnInit()
{
   socket = SocketCreate();
   if (socket != INVALID_HANDLE) {
      if (SocketConnect(socket, Address, Port, 1000)) {
         Print("Установлено подключение к ", Address, ":", Port, " socket=", socket);
         if (SockSend(socket, "Start")) {
            Print("Успешная отправка");
         }
         else {
            Print("Ошибка отправки ", GetLastError());
         }
      }
      else {
         Print("Подключение к ", Address, ":", Port, " не удалось, ошибка ", GetLastError());
      }
   }
   else {
      Print("Не удалось создать сокет, ошибка ", GetLastError());
      return INIT_FAILED;
   }
   return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   if (SockSend(socket, "End")) {
      Print("Успешная отправка");
   }
   else {
      Print("Ошибка отправки ", GetLastError()," socket=", socket);
   }
   Print("Отключаемся...." );
   Print("Результат ", SocketClose(socket));
}
//+------------------------------------------------------------------+
void OnTick()
{
}
//+------------------------------------------------------------------+
bool SockSend(int sock, string request)
{
   char req[];
   int  len = StringToCharArray(request, req) - 1;
   if(len < 0) return(false);
   return(SocketSend(sock, req, len) == len);
}
//+------------------------------------------------------------------+

Получаем:


Происходит принудительное закрытие сокета до OnDeInit? Возможно ли вообще реализовать такую отправку?

 
Sergey Zhilinskiy:

Нужно в сокет отправить сообщение по завершению работы эксперта. Делаю так

Получаем:


Происходит принудительное закрытие сокета до OnDeInit? Возможно ли вообще реализовать такую отправку?

Добавьте в OnDeinit создание нового хендла и новое подключение

2023.05.15 09:52:30.934 Socet test (USDJPY,H1)  Установлено подключение к www.mql5.com:80 socket=1
2023.05.15 09:52:30.934 Socet test (USDJPY,H1)  Успешная отправка
2023.05.15 09:52:35.896 Socet test (USDJPY,H1)  Установлено подключение к www.mql5.com:80 socket=1
2023.05.15 09:52:35.896 Socet test (USDJPY,H1)  Успешная отправка
2023.05.15 09:52:35.896 Socet test (USDJPY,H1)  Отключаемся....
2023.05.15 09:52:35.896 Socet test (USDJPY,H1)  Результат true

И если не трудно скажите как вы настроили подключение к 127.0.0.1:8080 у меня что-то не получилось это.

 
Alexey Viktorov #:

Добавьте в OnDeinit создание нового хендла и новое подключение

Грабли конечно, но попробую. Спасибо!

И если не трудно скажите как вы настроили подключение к 127.0.0.1:8080 у меня что-то не получилось это.

Запустил простенький socket сервер с такими параметрами.

 
Sergey Zhilinskiy #:

Грабли конечно, но попробую. Спасибо!

Запустил простенький socket сервер с такими параметрами.

Может и не грабли. А что будет если г…кодер при выходе не закроет сокет? Может по этому разработчики перестраховались и принудительно закрывают сокет.

 
Тоже об этом подумал
 
Sergey Zhilinskiy #:

Запустил простенький socket сервер с такими параметрами.

Как вы думаете, через сокет обмен между двумя терминалами на одном компе будет быстрей работать чем через файл?

Можно инструкцию по запуску такого сервера…

 
Alexey Viktorov #:

Как вы думаете, через сокет обмен между двумя терминалами на одном компе будет быстрей работать чем через файл?

Можно инструкцию по запуску такого сервера…

Можно и через файл сделать быстро если файл располагать на RAM диске.

Я сервер делал на Python, в сети примеров навалом.
 
Sergey Zhilinskiy #:


Я сервер делал на Python, в сети примеров навалом.

Как я понимаю, средствами питона интегрированного в MQL этого не сделать… Так?

 
Alexey Viktorov #:

Как я понимаю, средствами питона интегрированного в MQL этого не сделать… Так?

Не могу сказать точно, я не пробовал.

 
 
Alexey Viktorov #:

Как я понимаю, средствами питона интегрированного в MQL этого не сделать… Так?

Алексей, есть статейный материал, где посредством WinAPI можно сделать сервер. Имхо, одна из лучших статей. 

Работа с сокетами в MQL, или Как стать провайдером сигналов
Работа с сокетами в MQL, или Как стать провайдером сигналов
  • www.mql5.com
Сокеты… Что вообще сейчас в нашем информационном мире может без них существовать? Впервые появившиеся в 1982 г. и практически не изменившиеся до настоящего времени, они исправно работают на нас каждую секунду. Это основа сети, нервные окончания нашей Matrix, в которой мы живем.