文章 "使用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:
它不起作用,提示同样的错误,我该如何修复?

我一周前刚刚修改了所有课程。

它运行正常。

 

首先,我要感谢作者撰写这篇文章。我认为这个话题主要与那些已经拥有自己的原创开发成果并寻求保护知识产权的交易者相关。通过服务器传输交易信号的模式非常适合这一目的。

亚历克斯,你的文章写得非常好,但我认为其中有一点非常重要,即如何通过安全连接(256 位加密)加密传输所有这些数据。也就是说,计算机 A 的信号通过安全连接传输到服务器,反过来,计算机 B 也通过安全连接从服务器读取这些数据。通过这种信号传输组织方式,中间商将无法追踪这些信号的来源,因为所有流量都已加密。

亚历克斯,你对此有何看法,如何更有效地解决安全问题?

 
enotis:

亚历克斯,你对此有何看法,如何才能更有效地解决安全问题?

我想让你看看文章的第二部分--POST 传输和多址/表单数据的使用。

至于安全问题,我知道你说的是使用 SSL 证书?

这可以通过在创建请求时添加两个标志来解决。但我建议使用 WinHttp.dll 来处理 SSL。

在请求创建界面中,一切都几乎相同,但它被宣传为更先进,功能也更多一些。

 
sergeev:

我想指导你阅读文章的第二部分--POST 传输和多art/form-data 的使用。

至于安全性,我知道你说的是使用 SSL 证书?

这可以通过在创建请求时添加两个标志来解决。但我建议使用 WinHttp.dll 来处理 SSL。

请求创建界面中的一切几乎都是一样的,但它被宣传为更先进,功能也更多一些。


是的,我指的是 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 网站上提到的任何东西都无法工作了,您能提供 metachat 的PHP 源代码吗?非常感谢。