错误、漏洞、问题 - 页 2707

 
Sergey Dzyublik:

请开发人员(@Ilyas)注意检测到的错误。
Bug MT5(build 2377)当为指针类型的参数选择合适的重载函数时,将类型转换为指向父类 而非基类的指针的函数变得更优先。
当基类的指针被分配到父类的指针上时,也不会出现编译时错误。

可能相关的错误:https://www.mql5.com/ru/forum/1111/page2682#comment_15591437

class A{};
class B : public A{};
class C : public B{};


struct T{
   static void test(A*){
      printf("A*");
   }
   static void test(C*){
      printf("C*");
   }
};

struct TT{
   static void test(B*){
      printf("B*");
   }
};

void OnStart(){
   B b;
   T::test(&b);            // Runtime Error: Incorrect casting of pointers.  Expected result: printf("A*");
   
   A a;
   TT::test(&a);           // Runtime Error: Incorrect casting of pointers.  Expected result: Compilation Error
   B* ptr = &a;            // Runtime Error: Incorrect casting of pointers.  Expected result: Compilation Error
}

谢谢你的留言。

纠正的是

Runtime Error: Incorrect casting of pointers.  Expected result: printf("A*");


保持原样--这段代码可能是模板特殊化的结果(在一部分不会工作,但会影响编译)。

Runtime Error: Incorrect casting of pointers.  Expected result: Compilation Error
Runtime Error: Incorrect casting of pointers.  Expected result: Compilation Error
 
Roman:

是的,在你的代码中,80端口的头会被返回,443端口则不会。
再次重温了你的代码,没有看到SocketTlsHandshake函数。
你的代码没有做握手的动作。这可能是原因。
虽然这个功能的帮助说,如果你连接到443端口,就不需要这个功能。

没错,这不是我的代码,而是来自开发者的例子(MQ的套接字有一些不直观的功能,有时会在论坛上被弄明白,所以我转向标准的例子)。 我试过SocketTlsHandshake - 它在所有条件下总是返回false,对解决问题没有影响。由于证书数据被返回,握手就会通过。即使是头,从其长度来看,也是来了,但就是不返回MQL代码。错误代码 太笼统,错误本身也值得怀疑。我们需要一个内部人的观点。
 
Stanislav Korotky:
没错,这不是我的代码,而是来自开发者的例子(MQ的套接字有一些不直观的功能,有时会在论坛上弄明白,所以我转向了标准的例子)。 SocketTlsHandshake我试过了 - 它在所有条件下总是返回false,对问题的解决没有影响。由于证书数据被返回,握手就会通过。即使是头,从其长度来看,也是到达了,但就是不返回MQL代码。错误代码 太笼统了,而且错误本身也值得怀疑。我们需要一个内部人的观点。

如果连接最初是安全的("https://"或端口443或465),则不需要使用SocketTlsHandshake函数。

该函数被用于特殊情况/协议中

 
Ilyas:

如果连接最初是安全的("https://"或端口443或465),则不需要使用SocketTlsHandshake。

该函数被用于特殊情况/协议中

我不使用它。重现该问题的代码见附件。

 
Stanislav Korotky:

我不使用它。重现该问题的代码见附件。

SocketTlsReadAvailable 取代SocketTlsRead

 
Ilyas:

用SocketTlsReadAvailable取代SocketTlsRead

你能说得更具体些吗?在示例文档中,使用的是SocketTlsRead。为什么那里没有使用SocketTlsReadAvailable?

什么时候应该使用一种功能,什么时候应该使用另一种功能?

如何编写阻断从套接字读取的通用代码,适用于受保护和不受保护的连接 - 我们没有SocketReadAvailable函数,是吗?

PS。改变了功能。错误并没有消失。以下是更新后的代码。GetLastError返回0。

附加的文件:
 

在视觉测试器中,从指标中调用CopyTicksRange 函数,以错误4014(ERR_FUNCTION_NOT_ALLOWED)终止

同样的指标在同一仪器上在线工作正常。有什么问题呢?这个功能在测试器中是否被禁止?在帮助中没有找到任何关于它的说法。

 
Stanislav Korotky:

在视觉测试器中,从指标中调用CopyTicksRange 函数,以错误4014(ERR_FUNCTION_NOT_ALLOWED)终止

同样的指标在同一仪器上在线工作正常。有什么问题呢?这个功能在测试器中是否被禁止?我没有在帮助中找到它。

用真正的蜱虫测试?

 
Stanislav Korotky:
没错,这不是我的代码,而是来自开发者的例子(来自MQ的套接字有一些不直观的功能,有时会在论坛上弄明白,所以我转向了标准的例子)。 我试过SocketTlsHandshake - 它在所有条件下总是返回错误,对解决问题没有影响。由于证书数据被返回,握手就会通过。即使是头,从其长度来看,也是到达了,但就是不返回MQL代码。错误代码 太笼统了,而且错误本身也值得怀疑。我们需要一个内部人的观点。

是的,我也很惊讶,没有SocketTlsHandshake,证书会被返回。
但在SocketTlsHandshake函数中,它调用了错误。
行为中存在着某种隐含的逻辑。

if(SocketConnect(socket, Address, Port, 5000) && SocketTlsHandshake(socket, Address))
Can't connect to echo.websocket.org:443, error 5274

UPD。
伊利亚斯的建议已被看到。
是的,没有这个功能,连接就没有问题。
问题在于阅读。
 
Ilyas:

用SocketTlsReadAvailable取代SocketTlsRead

我试着用SocketTlsReadAvailable 进行同样的替换

int rsp_len; 

if(ExtTLS)
   rsp_len = SocketTlsReadAvailable(socket, rsp, len); 
   //rsp_len = SocketTlsRead(socket, rsp, len);
else
   rsp_len = SocketRead(socket, rsp, len, timeout);

其行为与SocketTlsRead 相同。

UPD:
在不同的端口上使用SocketTlsHandshake时也存在同样的问题。