오류, 버그, 질문 - 페이지 2707

 
Sergey Dzyublik :

나는 개발자들( @Ilyas )에게 발견된 결함에 주의를 기울일 것을 요청한다.
포인터 유형 인수에 대해 적절한 오버로드된 함수를 선택할 때 MT5 버그(빌드 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 :

예, 실제로 코드에서 헤더는 포트 443이 아닌 포트 80으로 반환됩니다.
귀하의 코드를 다시 검토했지만 거기에서 SocketTlsHandshake 기능을 보지 못했습니다.
귀하의 코드는 악수를 생성하지 않습니다. 아마도 이것이 사실일 것입니다.
이 기능에 대한 도움말에는 연결이 포트 443으로 이동하는 경우 필요하지 않다고 나와 있습니다.

정확히 이것은 내 코드가 아니라 개발자의 예제에서 가져온 것입니다(MQ 소켓에는 포럼에서 가끔 볼 수 있는 직관적이지 않은 기능이 있으므로 표준 예제로 눈을 돌렸습니다). SocketTlsHandshake를 시도했습니다. 모든 조건에서 항상 false를 반환하고 문제 해결에 영향을 미치지 않습니다. 인증서 데이터가 반환되기 때문에 핸드셰이크가 진행됩니다. 길이로 판단해도 타이틀이 나오긴 하지만 MQL 코드로 리턴되지는 않는다. 오류 코드가 너무 일반적이며 오류의 사실 자체가 의심됩니다. 내부 모습이 필요합니다.
 
Stanislav Korotky :
정확히 이것은 내 코드가 아니라 개발자의 예제에서 가져온 것입니다(MQ 소켓에는 포럼에서 가끔 볼 수 있는 직관적이지 않은 기능이 있으므로 표준 예제로 눈을 돌렸습니다). SocketTlsHandshake를 시도했습니다. 모든 조건에서 항상 false를 반환하고 문제 해결에 영향을 미치지 않습니다. 인증서 데이터가 반환되기 때문에 핸드셰이크가 진행됩니다. 길이로 판단해도 타이틀이 나오긴 하지만 MQL 코드로 리턴되지는 않는다. 오류 코드가 너무 일반적이며 오류의 사실 자체가 의심됩니다. 내부 모습이 필요합니다.

연결이 처음에 안전한 경우("https://" 또는 포트 443 또는 465) SocketTlsHandshake 기능을 사용할 필요가 없습니다.

이 기능은 특별한 경우/프로토콜에서 사용됩니다.

 
Ilyas :

연결이 처음에 안전한 경우("https://" 또는 포트 443 또는 465) SocketTlsHandshake 기능을 사용할 필요가 없습니다.

이 기능은 특별한 경우/프로토콜에서 사용됩니다.

저도 사용하지 않습니다. 문제를 재현하는 코드가 첨부되어 있습니다.

 
Stanislav Korotky :

저도 사용하지 않습니다. 문제를 재현하는 코드가 첨부되어 있습니다.

SocketTlsRead를 SocketTlsReadAvailable 로 교체

 
Ilyas :

SocketTlsRead를 SocketTlsReadAvailable로 교체

더 자세히 알려주실 수 있나요? 설명서 예제에서는 SocketTlsRead를 사용합니다. SocketTlsReadAvailable이 사용되지 않은 이유는 무엇입니까?

한 기능은 언제 사용해야 하고 다른 기능은 언제 사용해야 합니까?

보안 연결과 비보안 연결 모두에 적합한 소켓에서 읽기를 차단하기 위한 범용 코드를 작성하는 방법 - 유사한 SocketReadAvailable 기능 이 없습니다.

추신. 대체된 기능입니다. 오류가 사라지지 않았습니다. 업데이트된 코드를 첨부합니다. GetLastError는 0을 반환합니다.

파일:
 

시각적 테스터에서 CopyTicksRange 함수 표시기의 호출은 오류 4014(ERR_FUNCTION_NOT_ALLOWED)와 함께 종료됩니다.

동일한 표시기는 동일한 기기에서 온라인으로 제대로 작동합니다. 캐치 뭔데? 테스터에서 이 기능을 금지하시겠습니까? 도움말에서 이에 대한 언급을 찾지 못했습니다.

 
Stanislav Korotky :

시각적 테스터에서 CopyTicksRange 함수 표시기의 호출은 오류 4014(ERR_FUNCTION_NOT_ALLOWED)와 함께 종료됩니다.

동일한 표시기는 동일한 기기에서 온라인으로 제대로 작동합니다. 캐치 뭔데? 테스터에서 이 기능을 금지하시겠습니까? 도움말에서 이에 대한 언급을 찾지 못했습니다.

실제 틱 테스트?

 
Stanislav Korotky :
정확히 이것은 내 코드가 아니라 개발자의 예제에서 가져온 것입니다(MQ 소켓에는 포럼에서 가끔 볼 수 있는 직관적이지 않은 기능이 있으므로 표준 예제로 눈을 돌렸습니다). SocketTlsHandshake를 시도했습니다. 모든 조건에서 항상 false를 반환하고 문제 해결에 영향을 미치지 않습니다. 인증서 데이터가 반환되기 때문에 핸드셰이크가 진행됩니다. 길이로 판단해도 타이틀이 나오긴 하지만 MQL 코드로 리턴되지는 않는다. 오류 코드가 너무 일반적이며 오류의 사실 자체가 의심됩니다. 내부 모습이 필요합니다.

예, SocketTlsHandshake 없이 인증서가 반환된다는 사실에도 놀랐습니다.
그리고 SocketTlsHandshake 함수를 사용하면 오류가 발생합니다.
행동의 어떤 종류의 명확하지 않은 논리.

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

상향:
일리야스의 추천을 보았다.
예, 이 기능이 없으면 연결에 문제가 없습니다.
문제는 읽기입니다.
 
Ilyas :

SocketTlsRead를 SocketTlsReadAvailable로 교체

나는 또한 그것을 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 와 동일합니다.  

상향:
다른 포트에서 SocketTlsHandshake를 사용할 때도 동일한 문제가 있습니다.