Erreurs, bugs, questions - page 2706

 

Quel est le code 556 ?

30 graphiques avec EA, à la compilation certains n'ont pas récupéré avec ce code, d'autres avec succès.

 
Igor Zakharov:

Quel est le code 556 ?

30 graphiques avec EA, sur la compilation certains n'ont pas récupéré avec ce code, l'autre avec succès.

Erreur lors de l'ouverture du fichier dip.ex5

Afficher le journal complet, pas un morceau de capture d'écran

 
Les endroits à inclure les journaux essaieront d'ajouter
 
Slava:

Erreur lors de l'ouverture du fichier dip.ex5

Afficher le journal complet, pas un morceau de capture d'écran

voir la pièce jointe.

Dossiers :
20200415.zip  5 kb
 

Quelqu'un peut-il me dire comment utiliser les sockets TLS avec le serveur d'écho ? J'ai pris le code source de l'exemple, j'ai ajouté les en-têtes. Sur le port 80, il effectue une mise à niveau, mais sur le port 443, il se connecte et obtient un certificat, mais ne peut ensuite rien lire des en-têtes. Si on l'exécute sous le débogueur, on peut voir queSocketIsReadable renvoie un nombre similaire, comme 245, mais que SocketTlsRead s'arrête au bout du compte sans rien renvoyer. Apparemment, une connaissance sacrée de MQ est requise.

Dossiers :
 

Bogue ME (build 2380) signature incorrecte du paramètre du modèle de fonction dans la description de l'erreur et l'information sur le paramètre.

template<typename T>
class A{};

class B{
public:  
   template<typename T>
   static void test(A<T> &, A<int>* = NULL){
      int x = 1 / 0;                       //'0' - division by zero |  in template 'void B::test(B:: A<T>&,A<int>*)' specified with [T=long]
   }
};

void OnStart(){
   A<long> a;
   B::test(a);                             // Parameter info: void test([unknown] &, [unknown] *=NULL)
}
 
Stanislav Korotky:

Quelqu'un peut-il me dire comment utiliser les sockets TLS avec le serveur d'écho ? J'ai pris le code source de l'exemple, j'ai ajouté les en-têtes. Sur le port 80, il effectue une mise à niveau, mais sur le port 443, il se connecte et obtient un certificat, mais ne peut ensuite rien lire des en-têtes. Si on l'exécute sous le débogueur, on peut voir que SocketIsReadable renvoie un nombre similaire, comme 245, mais que SocketTlsRead s'arrête au bout du compte sans rien renvoyer. Apparemment, une connaissance sacrée de MQ est requise.

Je n'ai pas non plus réussi à obtenir un tableau de réponses en octets en utilisant HTTPRecv, pour une analyse plus poussée du protocole.
Echoue sur le délai d'attente, parce que le ping pong n'est pas organisé, mais pour l'organiser il faut d'abord obtenir une réponse en octet du serveur, et la fonctionHTTPRecv elle-mêmecontient un délai d'attente.
Mais pour une raison quelconque, HTTPRecv n'analyse pas cet octet de réponse.

 
Roman:

Je n'ai pas non plus réussi à obtenir un tableau de réponses en octets en utilisant HTTPRecv pour une analyse plus poussée du protocole.
Il échoue sur le délai d'attente, parce que le ping pong n'est pas organisé, mais pour l'organiser il faut d'abord obtenir une réponse en octet du serveur, et la fonctionHTTPRecv elle-mêmecontient un délai d'attente.
Mais pour une raison quelconque, HTTPRecv n'analyse pas cet octet de réponse.

C'est juste la connexion elle-même. Il n'y a pas encore de ping - cela peut se produire plus tard dans le protocole websocket. Le problème se pose dans l'en-tête de réponse du serveur lorsqu'il doit accuser réception de la mise à jour. Si aucun TLS n'est utilisé, la connexion se fait normalement. Mais également avec TLS, il semble que l'en-tête du terminal arrive, mais ne soit pas renvoyé parSocketTlsRead.

 
Stanislav Korotky:

Il ne s'agit que de la connexion elle-même. Il n'y a pas encore de ping - cela peut arriver plus tard dans le protocole websocket. Le blocage se produit dans l'en-tête de réponse du serveur lorsqu'il doit accuser réception de la mise à niveau. Si aucun TLS n'est utilisé, la connexion se fait normalement. Mais avec TLS aussi, il semble que l'en-tête arrive dans le terminal, mais ne revient pas de SocketTlsRead.

Oui, je vois ce que je veux dire.
Oui, en effet, dans votre code, sur le port 80 l'en-tête renvoie, sur 443 il ne le fait pas.
J'ai revu votre code, et je n'ai pas vu la fonctionSocketTlsHandshake.
Votre code n'effectue pas de poignée de main. C'est peut-être la raison.
Bien que l'aide pour cette fonction indique qu'elle n'est pas nécessaire si vous vous connectez au port 443.
Donc c'est bizarre en général.

UPD :
Quelle que soit la façon dont je place l'en-tête de la requête, l'erreur persiste.

ERR_NETSOCKET_IO_ERROR 5273  Ошибка отправки/получения данных из сокета

Ou

HTTP/1.1 400 Bad Request

Peut-être que le développeur a interdit de recevoir la mise à jour vers TLS ?


UPD :
Pas d'erreur avec votre en-tête, mais pas d'en-tête de réponse non plus.
Dans la fonctionHTTPRecv, mettez un print pour voir ce qui arrive.

result += CharArrayToString(rsp, 0, rsp_len, CP_UTF8);
Print(result);

Il n'imprime qu'un seul caractère H
. Ce caractère me fait penser qu'il s'agit de la première lettre de l'en-tête de la réponse,
et n'imprime pas le reste de l'en-tête pour une raison quelconque.

Chers développeurs, pourriez-vous nous dire ce qu'il faut faire ?
S'agit-il d'une restriction intentionnelle ou d'une erreur dans TLS ?
Je me débats avec ce problème depuis longtemps, sans succès.

 
Sergey Dzyublik:

Merci aux développeurs(@Ilyas) de prêter attention au bug détecté.
Bogue MT5 (build 2377) lors de la sélection de la fonction surchargée appropriée pour un argument de type pointeur, la fonction avec la conversion de type en pointeur vers la classeparent au lieu de la classe de base devient plus prioritaire.
Il n'y a pas non plus d'erreur de compilation lorsque le pointeur vers la classe de base est assigné au pointeur vers la classe parent.

Bogue probablement lié: 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
}

Merci pour le message.

Corrigé par

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


Reste tel quel - ce code peut résulter de la spécialisation du template (dans une partie qui ne fonctionnera pas, mais qui affectera la compilation).

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