Обсуждение статьи "Использование WinInet.dll для обмена данными между терминалами через Интернет" - страница 2

 
Graff:

Номера ошибок разные.

ошибку исправили

в функции

int HttpOpenRequestW

надо определить 6 параметр как int, и передавать в него 0 соответственно вместо " "

int HttpOpenRequestW(int hConnect, string &lpszVerb, string &lpszObjectName, string &lpszVersion, string &lpszReferer, int lplpszAcceptTypes, uint dwFlags, int dwContext);


 
sergeev:

ошибку исправили

в функции

int HttpOpenRequestW

надо определить 6 параметр как int, и передавать в него 0 соответственно вместо " "

int HttpOpenRequestW(int hConnect, string &lpszVerb, string &lpszObjectName, string &lpszVersion, string &lpszReferer, int lplpszAcceptTypes, uint dwFlags, int dwContext);


Не работает пишет туже самую ошибку, как исправить?
 
arbuz:
Не работает пишет туже самую ошибку, как исправить?

я буквально неделю назад делал ревизию всех классов.

работает все отлично.

 

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

Alex, статья у Вас получилась отличная, но, как мне кажется, не затронут очень важный момент, а именно, как передавать все эти данные в зашифрованном в виде, через защищенное соединение (256-разрядное шифрование). Т.е. сигналы с компьютера-А через защищенное соединение передаются на сервера, в свою очередь компьютер-Б также по защищенному соединению считывает эти данные с сервера. При такой организации передачи сигналов брокер не будет иметь возможности отследить источник этих сигналов, поскольку весь трафик будет зашифрован.

Alex, что Вы об этом думаете и как эффективнее можно решить вопрос безопасности?

 
enotis:

Alex, что Вы об этом думаете и как эффективнее можно решить вопрос безопасности?

сразу хочу направить вас на вторую часть статьи - передача через POST и использование multipart/form-data

что касается безопасности, то я так понимаю вы говорите про работу с SSL сертификатами?

Это всё рашаемо добавлением двух флагов при создании запросов. Но я бы для SSL рекомендую работать с WinHttp.dll.

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


 
sergeev:

сразу хочу направить вас на вторую часть статьи - передача через POST и использование multipart/form-data

что касается безопасности, то я так понимаю вы говорите про работу с SSL сертификатами?

Это всё рашаемо добавлением двух флагов при создании запросов. Но я бы для SSL рекомендую работать с WinHttp.dll.

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


Да, я имел ввиду именно SSL сертификаты. Спасибо за совет, взял себе на заметку. Если я Вас правильно понял, то Вы согласны с тем, что такая модель организации передачи данных может считаться достаточной безопасной?
 
enotis:
Да, я имел ввиду именно SSL сертификаты. Спасибо за совет, взял себе на заметку. Если я Вас правильно понял, то Вы согласны с тем, что такая модель организации передачи данных может считаться достаточной безопасной?

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

это функция класса MqlNet, с проверкой SSL

//------------------------------------------------------------------ Request
bool MqlNet::Request(tagRequest &req)
{
  if(!TerminalInfoInteger(TERMINAL_DLLS_ALLOWED)) { Print("-DLL not allowed"); return(false); } // проверка разрешенни DLL в терминале
  if(!MQL5InfoInteger(MQL5_DLLS_ALLOWED)) { Print("-DLL not allowed"); return(false); } // проверка разрешенни DLL в терминале
  if (req.toFile && req.stOut=="") { Print("-File not specified "); return(false); }
  uchar data[]; int hRequest, hSend; 
  string Vers="HTTP/1.1"; string nill="";
  if (req.fromFile) { if (FileToArray(req.stData, data)<0) { Print("-Err reading file "+req.stData); return(false); } }// прочитали файл в массив
  else StringToCharArray(req.stData, data);
  
  if (hSession<=0 || hConnect<=0) { Close(); if (!Open(Host, Port, User, Pass, Service)) { Print("-Err Connect"); Close(); return(false); } }
  // создаем дескриптор запроса
  hRequest=HttpOpenRequestW(hConnect, req.stVerb, req.stObject, Vers, nill, 0, INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_RELOAD|INTERNET_FLAG_PRAGMA_NOCACHE, 0); 
  if (hRequest<=0) { Print("-Err OpenRequest"); InternetCloseHandle(hConnect); return(false); }
  
  
  // отправляем запрос
  int n=0;
  while (n<3) // делаем две попытки отправки. первая обычная, вторая если требуется SSL
  {
    n++;
    hSend=HttpSendRequestW(hRequest, req.stHead, StringLen(req.stHead), data, ArraySize(data)); // отправили файл
    if (hSend<=0) // если отправка неудачна, то проверим SSL
    {       
      int err=0; err=GetLastError(err); Print("-Err SendRequest= ", err); 
      if (err!=ERROR_INTERNET_INVALID_CA) // если ошибка действительно связана с запросом SSL
      {
        int dwFlags;
        int dwBuffLen = sizeof(dwFlags); // ставим дополнительные флаги
        InternetQueryOptionW(hRequest, INTERNET_OPTION_SECURITY_FLAGS, dwFlags, dwBuffLen);
        dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
        int rez=InternetSetOptionW(hRequest, INTERNET_OPTION_SECURITY_FLAGS, dwFlags, sizeof (dwFlags));
        if (!rez) { Print("-Err InternetSetOptionW= ", GetLastError(err)); break; }
      }
      else break;
    } 
    else break;
  }
  if (hSend>0) ReadPage(hRequest, req.stOut, req.toFile); // читаем страницу, если отправили
  InternetCloseHandle(hRequest); InternetCloseHandle(hSend); // закрыли все хендлы
  if (hSend<=0) Close(); // закрываем при ошибке
  return(true);
}


 

в качестве флагов еще можно ставить

    dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
    dwFlags |= SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;
    dwFlags |= SECURITY_FLAG_IGNORE_CERT_CN_INVALID;
   


 
sergeev:

в качестве флагов еще можно ставить

    dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
    dwFlags |= SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;
    dwFlags |= SECURITY_FLAG_IGNORE_CERT_CN_INVALID;
   


Да, вариантов по шифрованию не мало, но это тема пожалуй отдельной статьи. Для начала нужно поднять модель передачи сигналов через хостинг. Спасибо за советы.
 
Не работает в windows 7 x64, но отлично работает в windows xp x86. В методе MqlNet::Request не срабатывает вызов HttpOpenRequestW. Подозреваю, что в wininet.dll изменились параметры вызова функции. Кто-нибудь сталкивался с такой проблемой?
Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Основы языка / Функции / Вызов функции - Документация по MQL5
Причина обращения: