文章 "MetaTrader 5 中的 WebSockets" - 页 2

 
Renat Fatkhullin:

你只是不了解或不知道如何使用 这一功能。

该功能会立即给出输入缓冲区中 可用的字节数,但不会告诉你套接字是否还活着。这个函数非常重要,它允许你不进入同步等待,而是在不失去对程序控制的情况下逐段读出数据。

TLS 功能也是正确的--它们是为受过培训的用户 提供的,这些用户知道如何使用以及使用的顺序。它们不是为那些 "调用后就完事了 "的人准备的。


不仅如此,socket 和 TLS 函数的纯粹形式与终端用于原始/tls/https 连接的函数相同。也就是说,一切运行正常。在我们的高负载解决方案中,这些实现方式也是一样的。

原始网络函数不适合初学者,也不适合天真地使用。我们应该充分了解网络交互的原理和特殊性。如果我们谈论的是 TLS,那么就需要了解处理握手过程的方法和顺序。

该函数没有缓冲区参数。
我不知道你 的是什么理解,也不知道是针对哪些用户,伊利亚斯发现了这个错误,并将其视为一个错误。
关键是所有用户都是以套接字文档中的示例为导向的。

问题在于函数 SocketIsReadable(socket) 的返回值并不明确,对于 wss 而言是:frame。

Документация по MQL5: Сетевые функции / SocketIsReadable
Документация по MQL5: Сетевые функции / SocketIsReadable
  • www.mql5.com
SocketIsReadable - Сетевые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Stanislav Korotky:

这背后有什么道理吗?这个神奇的数字是什么,为什么信息长度为 256 或 1500 就没有问题?

理由是什么?我不知道。变量中的数字读取没有问题。
你可以把它设为最大值,这不会影响任何事情。

string CWs::Recv()
{
   uchar   rsp[]; //, res[];
   string  result  = "";
   //uint timeout_check = GetTickCount() + timeout;

   //做
   //{
      uint len = 65536; //SocketIsReadable(socket);

      //if(len)
      //{
         int rsp_len = SocketTlsReadAvailable(socket, rsp, len);

         //if(rsp_len > 0)
         //{
            /ArrayInsert(res, rsp, ArraySize(res), 0); 
            //断开;
         //} 
      //}
   //}
   //while(GetTickCount() < timeout_check && !IsStopped());

   if(rsp_len > 0) //(ArraySize(res) > 0)
      result = Unpack(rsp, ArraySize(rsp));
   
  
   return(result);
}

通过SocketIsReadable(socket)函数,你可以知道读取时会出错。

SocketIsReadable(socket) 在 len 中返回的内容与SocketTlsRead() 和 SocketTlsReadAvailable() 中的内容不符。

Документация по MQL5: Сетевые функции / SocketIsReadable
Документация по MQL5: Сетевые функции / SocketIsReadable
  • www.mql5.com
SocketIsReadable - Сетевые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Roman:

该函数没有缓冲区参数。
我不知道你 的是哪种理解,也不知道是针对哪些用户,这个错误是 Ilyas 发现的,我想他把它当成了一个错误。
关键是所有用户都以套接字文档中的示例为导向。

问题在于函数 SocketIsReadable(socket) 的返回值并不清楚,对于 wss: frame 而言,它返回的是什么。

所以,你根本不了解套接字及其缓冲区,却教给我们错误。

SocketIsReadable 检查传入缓冲区中原始数据的大小肯定不符合处理加密数据的 Tls 函数的要求。

把它当作一个错误"--人们总能把任何简洁的回答当作认罪。请给出明确的答案。
 
Renat Fatkhullin:
所以,你根本不了解插座及其缓冲区,却教给我们错误。 。

在 SocketIsReadable 中检查传入缓冲区中原始数据的大小肯定不符合 Tls 函数,因为 Tls 函数处理的是接收到的较小的加密数据。


您写到了SocketIsReadible 函数的缓冲区,但如果用户无法使用该缓冲区,那么提到它就很奇怪了

 
请阅读文章并查看建议的代码。

在我们讨论一个复杂协议的实施质量时,声称几行无法重现的代码存在错误是很奇怪的。

 
Roman:

问题是关于SocketIsReadible 函数的,该函数有一个内部缓冲区,这一点很清楚。
你写的是SocketIsReadible 函数的缓冲区,但如果用户无法使用该 缓冲区,那么提到它就很奇怪了。

我再次重复--你不了解套接字,也不知道它们的特殊性。

你甚至错误地认为SocketIsReadable 的"内部 "缓冲区并不存在。套接字中的缓冲区是谁的?由谁管理?它们是如何工作的?

因此,当现实与天真的认知出现偏差时,错误声明就会被滥用。



 
Renat Fatkhullin:

被当作错误"--人们总是把任何整齐划一的回答误认为是认罪。给我一个明确的答案。

.
il

r

il1

 
Roman:

.


他回答的第一部分是正确的,它解释了原始数据和解密数据大小的区别。

但最后一个答案是以拐杖的形式出现的私人情况(固定大小)。这很可能是在另一段三行代码的背景下,除了私下修正/拐杖之外,什么都不能提供。

Ilyas 不处理套接字。没有错误确认。

供参考:我在 MT5 中编写了原始套接字、tls、https 及其衍生物的实现。自 1995 年以来,我还编写了数十个网络协议 的实现。

因此,与我争论是很奇怪的。数以千万计的设备都在使用我的实现。
 
Renat Fatkhullin:
答案的第一部分是正确的,它解释了原始数据和解密数据大小的区别。

但最后一个答案是以拐杖的形式私下进行的案例(修正大小)。最有可能的情况是,在另一段三行代码的背景下,除了私下更正/拐杖之外,什么都不能提供。

Ilyas 不处理套接字。没有错误确认。

供参考:我在 MT5 中编写了原始套接字、tls、https 及其衍生物的实现。自 1995 年以来,我还编写了数十个网络协议的实现。

因此,与我争论是很奇怪的。数以千万计的设备都在使用我的实现。

我理解您无可争议的经验。
但这篇文章并没有揭示如何在 MQL 中正确使用 wss: 的问题!
因为文章的作者和所有其他(甚至高级)用户都不了解这一点。
这就是为什么我在我的实现中使用固定大小作为拐杖。

请在考虑到SocketIsReadable 池的情况下,向我展示 MQL 中正确的 wss: 框架读取方法,每个人都会说谢谢。

 
Roman:

我理解您无可争议的经验。
但这篇文章并没有揭示如何在 MQL 中正确使用 wss: 的问题!
因为这篇文章的作者并不像所有其他用户(即使是高级用户)一样了解这一点。
这就是为什么我在实现中使用固定大小作为拐杖。

请在考虑到SocketIsReadable 池的情况下,向我展示 MQL 中正确的 wss: 框架读取方法,每个人都会说谢谢。

我现在没有时间,但我应该在标准 MQL5库中 制作一套 CSocketRaw、CSocketTLS、CSocketHTTP 实现。

如果我有 8 个小时的空闲时间,我会做的。