Discusión sobre el artículo "Usar WinInet.dll para el intercambio de datos entre terminales por internet" - página 2

 
Graff:

Los números de error son diferentes.

el error se ha corregido

en la función

int HttpOpenRequestW

es necesario definir el 6º parámetro como int, y pasarle 0 en lugar de " ".

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

 
sergeev:

error corregido

en la función

int HttpOpenRequestW

es necesario definir el 6º parámetro como int, y pasarle 0 en lugar de " "

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


No funciona, me da el mismo error, ¿cómo solucionarlo?
 
arbuz:
No funciona, da el mismo error, ¿cómo lo arreglo?

Acabo de hacer una revisión de todas las clases hace una semana.

Funciona bien.

 

En primer lugar, me gustaría dar las gracias al autor por este artículo. Creo que este tema es relevante principalmente para aquellos operadores que ya tienen sus desarrollos originales y buscan proteger su propiedad intelectual. El modelo de transmisión de señales de trading a través del servidor se ajusta perfectamente a este propósito.

Alex, tu artículo es excelente, pero creo que no se ha tocado un punto muy importante, a saber, cómo transmitir todos estos datos de forma encriptada a través de una conexión segura (encriptación de 256 bits). Es decir, las señales del ordenador-A se transmiten al servidor a través de una conexión segura, a su vez el ordenador-B también lee estos datos del servidor a través de una conexión segura. Con esta organización de la transmisión de señales, el broker no podrá rastrear el origen de estas señales, ya que todo el tráfico estará encriptado.

Alex, ¿qué opinas de esto y cómo puede resolverse el problema de la seguridad de forma más eficaz?

 
enotis:

Alex, ¿qué opinas de esto y cómo se puede resolver el problema de seguridad de forma más eficaz?

Me gustaría dirigirte a la segunda parte del artículo - transmisión POST y uso de multipart/form-data.

En cuanto a la seguridad, ¿entiendo que te refieres a trabajar con certificados SSL?

Esto se puede solucionar añadiendo dos banderas al crear peticiones. Pero yo recomendaría trabajar con WinHttp.dll para SSL.

Todo es casi idéntico en la interfaz de creación de peticiones, pero se anuncia como más avanzado y tiene un poco más de funcionalidades.

 
sergeev:

Me gustaría dirigirte a la segunda parte del artículo - transmisión POST y uso de multipart/form-data.

En cuanto a la seguridad, entiendo que se refiere a trabajar con certificados SSL.

Esto se puede solucionar añadiendo dos banderas al crear peticiones. Pero yo recomendaría trabajar con WinHttp.dll para SSL.

Todo es casi idéntico en la interfaz de creación de peticiones, pero se anuncia como más avanzado y tiene un poco más de funcionalidades.


Sí, me refería a los certificados SSL. Gracias por el consejo, lo he tenido en cuenta. Si le he entendido bien, ¿está de acuerdo en que este modelo de organización de la transferencia de datos puede considerarse suficientemente seguro?
 
enotis:
Sí, me refería a los certificados SSL. Gracias por su consejo, lo he tenido en cuenta. Si le he entendido bien, ¿está de acuerdo en que este modelo de organización de la transferencia de datos puede considerarse suficientemente seguro?

Probablemente se te ocurran otras opciones. Por ejemplo, puedes cifrar tú mismo tus datos y transmitirlos en abierto.

esta es una función de la clase MqlNet, con verificación SSL

//------------------------------------------------------------------ Request
bool MqlNet::Request(tagRequest &req)
{
  if(!TerminalInfoInteger(TERMINAL_DLLS_ALLOWED)) { Print("-DLL not allowed"); return(false); } // comprueba si la DLL está permitida en el terminal
  if(!MQL5InfoInteger(MQL5_DLLS_ALLOWED)) { Print("-DLL not allowed"); return(false); } // comprueba si la DLL está permitida en el terminal
  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); } }// leer el archivo en un array
  else StringToCharArray(req.stData, data);
  
  if (hSession<=0 || hConnect<=0) { Close(); if (!Open(Host, Port, User, Pass, Service)) { Print("-Err Connect"); Close(); return(false); } }
  // crear un descriptor de petición
  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); }
  
  
  // enviar la solicitud
  int n=0;
  while (n<3) // realiza dos intentos de envío. el primero es normal, el segundo si se requiere SSL
  {
    n++;
    hSend=HttpSendRequestW(hRequest, req.stHead, StringLen(req.stHead), data, ArraySize(data)); // enviado el archivo
    if (hSend<=0) // si el envío no tiene éxito, compruebe SSL
    {       
      int err=0; err=GetLastError(err); Print("-Err SendRequest= ", err); 
      if (err!=ERROR_INTERNET_INVALID_CA) // si el error está realmente relacionado con la petición SSL
      {
        int dwFlags;
        int dwBuffLen = sizeof(dwFlags); // establecer banderas adicionales
        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); // leer la página si se envía
  InternetCloseHandle(hRequest); InternetCloseHandle(hSend); // cerrar todas las asas
  if (hSend<=0) Close(); // cerrar en caso de error
  return(true);
}
 

también puede establecer las siguientes banderas

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

 
sergeev:

también puede establecer las siguientes banderas

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


Sí, hay un montón de opciones para el cifrado, pero este es el tema de un artículo aparte. Primero tenemos que plantear el modelo de señalización a través del hosting. Gracias por los consejos.
 

Hola,

Metachat es una buena idea y me gustaría tener uno funcionando yo mismo.

Ya no funciona nada de lo que se menciona en el sitio fxmaster.de, ¿podrían proporcionarme la fuente PHP de metachat? Muchas gracias.