Обсуждение статьи "Использование 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;
   


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

Здравствуйте,

Metachat - хорошая идея, и я хотел бы сам заставить его работать.

На сайте fxmaster.de больше ничего не работает - не могли бы вы предоставить PHP-исходник для metachat? Большое спасибо.