Discussion de l'article "Utilisation de WinInet.dll pour l’échange de données entre terminaux via Internet" - page 2

 
Graff:

Les numéros d'erreur sont différents.

l'erreur a été corrigée

dans la fonction

int HttpOpenRequestW

il est nécessaire de définir le 6ème paramètre comme int, et de lui passer 0 au lieu de " ".

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

 
sergeev:

erreur corrigée

dans la fonction

int HttpOpenRequestW

il faut définir le 6ème paramètre comme int, et lui passer 0 au lieu de " ".

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


Cela ne fonctionne pas, j'obtiens la même erreur, comment la corriger ?
 
arbuz:
Cela ne fonctionne pas, il y a la même erreur, comment faire ?

Je viens de faire une révision de toutes les classes il y a une semaine.

Cela fonctionne très bien.

 

Tout d'abord, je tiens à remercier l'auteur pour cet article. Je pense que ce sujet est surtout pertinent pour les traders qui ont déjà leurs développements originaux et qui cherchent à protéger leur propriété intellectuelle. Le modèle de transmission des signaux de trading par le biais du serveur convient parfaitement à cet objectif.

Alex, votre article est excellent, mais je pense qu'un point très important n'a pas été abordé, à savoir comment transmettre toutes ces données sous forme cryptée par le biais d'une connexion sécurisée (cryptage 256 bits). En d'autres termes, les signaux de l'ordinateur A sont transmis au serveur par le biais d'une connexion sécurisée, et l'ordinateur B lit à son tour ces données sur le serveur par le biais d'une connexion sécurisée. Avec une telle organisation de la transmission des signaux, le courtier ne sera pas en mesure de remonter à la source de ces signaux, car tout le trafic sera crypté.

Alex, qu'en pensez-vous et comment la question de la sécurité peut-elle être résolue plus efficacement ?

 
enotis:

Alex, qu'en pensez-vous et comment la question de la sécurité peut-elle être résolue plus efficacement ?

Je vous renvoie à la deuxième partie de l' article - transmission POST et utilisation de multipart/form-data.

En ce qui concerne la sécurité, j'ai cru comprendre que vous parliez de travailler avec des certificats SSL ?

Cela peut être résolu en ajoutant deux drapeaux lors de la création des requêtes. Mais je recommanderais de travailler avec WinHttp.dll pour SSL.

Tout est presque identique dans l'interface de création de requêtes, mais il est annoncé comme plus avancé et possède un peu plus de fonctionnalités.

 
sergeev:

Je vous renvoie à la deuxième partie de l' article - transmission POST et utilisation de multipart/form-data.

En ce qui concerne la sécurité, j'ai cru comprendre que vous parliez de travailler avec des certificats SSL ?

Cela peut être résolu en ajoutant deux drapeaux lors de la création des requêtes. Mais je recommanderais de travailler avec WinHttp.dll pour SSL.

Tout est presque identique dans l'interface de création de requêtes, mais il est annoncé comme plus avancé et possède un peu plus de fonctionnalités.


Oui, je faisais référence aux certificats SSL. Merci pour le conseil, je l'ai pris en considération. Si je vous ai bien compris, vous êtes d'accord pour dire que ce modèle d'organisation du transfert de données peut être considéré comme suffisamment sûr ?
 
enotis:
Oui, je faisais référence aux certificats SSL. Je vous remercie de votre conseil, j'en ai tenu compte. Si je vous comprends bien, vous êtes donc d'accord pour dire que ce modèle d'organisation du transfert de données peut être considéré comme suffisamment sûr ?

Vous pouvez probablement imaginer d'autres options, par exemple crypter vous-même vos données et les transmettre au grand jour.

il s'agit d'une fonction de la classe MqlNet, avec vérification SSL

//------------------------------------------------------------------ Request
bool MqlNet::Request(tagRequest &req)
{
  if(!TerminalInfoInteger(TERMINAL_DLLS_ALLOWED)) { Print("-DLL not allowed"); return(false); } // vérifier si la DLL est autorisée dans le terminal
  if(!MQL5InfoInteger(MQL5_DLLS_ALLOWED)) { Print("-DLL not allowed"); return(false); } // vérifier si la DLL est autorisée dans le 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); } }// lire le fichier dans un tableau
  else StringToCharArray(req.stData, data);
  
  if (hSession<=0 || hConnect<=0) { Close(); if (!Open(Host, Port, User, Pass, Service)) { Print("-Err Connect"); Close(); return(false); } }
  // créer un descripteur de demande
  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); }
  
  
  // envoyer la demande
  int n=0;
  while (n<3) // La première est normale, la seconde si SSL est requis.
  {
    n++;
    hSend=HttpSendRequestW(hRequest, req.stHead, StringLen(req.stHead), data, ArraySize(data)); // a envoyé le fichier
    if (hSend<=0) // si l'envoi n'aboutit pas, vérifier SSL
    {       
      int err=0; err=GetLastError(err); Print("-Err SendRequest= ", err); 
      if (err!=ERROR_INTERNET_INVALID_CA) // si l'erreur est réellement liée à la requête SSL
      {
        int dwFlags;
        int dwBuffLen = sizeof(dwFlags); // définir des drapeaux supplémentaires
        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); // lire la page si elle est envoyée
  InternetCloseHandle(hRequest); InternetCloseHandle(hSend); // fermer toutes les poignées
  if (hSend<=0) Close(); // fermer en cas d'erreur
  return(true);
}
 

vous pouvez également définir les drapeaux suivants

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

 
sergeev:

vous pouvez également définir les drapeaux suivants

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


Oui, il y a beaucoup d'options pour le cryptage, mais c'est le sujet d'un article séparé. Nous devons d'abord améliorer le modèle de signalisation par l'intermédiaire de l'hébergement. Merci pour vos conseils.
 

Bonjour,

Metachat est une bonne idée et j'aimerais en faire fonctionner un moi-même.

Rien de ce qui est référencé sur le site fxmaster.de ne fonctionne plus - pouvez-vous fournir la source PHP de metachat ? Merci beaucoup.